skytraq.cc holux.cc tmpro.cc tpg.cc tpo.cc
xcsv.cc tiger.cc easygps.cc
saroute.cc navicache.cc delgpl.cc
- ozi.cc text.cc html.cc netstumbler.cc
+ ozi.cc text.cc html.cc
igc.cc brauniger_iq.cc shape.cc hiketech.cc glogbook.cc
- vcf.cc lowranceusr.cc an1.cc tomtom.cc
+ vcf.cc lowranceusr.cc tomtom.cc
tef_xml.cc maggeo.cc vitosmt.cc gdb.cc bcr.cc
ignrando.cc stmwpp.cc cst.cc nmn4.cc compegps.cc
yahoo.cc unicsv.cc wfff_xml.cc garmin_txt.cc gpssim.cc
- stmsdf.cc gtrnctr.cc dmtlog.cc raymarine.cc alan.cc vitovtt.cc
+ stmsdf.cc gtrnctr.cc dmtlog.cc raymarine.cc vitovtt.cc
ggv_log.cc g7towin.cc garmin_gpi.cc lmx.cc random.cc xol.cc dg-100.cc
navilink.cc mtk_logger.cc ik3d.cc osm.cc destinator.cc exif.cc vidaone.cc
igo8.cc gopal.cc humminbird.cc mapasia.cc gnav_trl.cc navitel.cc ggv_ovl.cc
jtr.cc sbp.cc sbn.cc mmo.cc skyforce.cc itracku.cc v900.cc
- pocketfms_bc.cc pocketfms_fp.cc pocketfms_wp.cc naviguide.cc enigma.cc
+ pocketfms_bc.cc pocketfms_fp.cc pocketfms_wp.cc enigma.cc
vpl.cc teletype.cc jogmap.cc bushnell.cc bushnell_trl.cc wintec_tes.cc
subrip.cc garmin_xt.cc garmin_fit.cc
mtk_locus.cc googledir.cc mapbar_track.cc mapfactor.cc f90g_track.cc
)
set(HEADERS
- an1sym.h
cet.h
cet_util.h
csv_util.h
skytraq.cc holux.cc tmpro.cc tpg.cc tpo.cc \
xcsv.cc tiger.cc easygps.cc \
saroute.cc navicache.cc delgpl.cc \
- ozi.cc text.cc html.cc netstumbler.cc \
+ ozi.cc text.cc html.cc \
igc.cc brauniger_iq.cc shape.cc hiketech.cc glogbook.cc \
- vcf.cc lowranceusr.cc an1.cc tomtom.cc \
+ vcf.cc lowranceusr.cc tomtom.cc \
tef_xml.cc maggeo.cc vitosmt.cc gdb.cc bcr.cc \
ignrando.cc stmwpp.cc cst.cc nmn4.cc compegps.cc \
yahoo.cc unicsv.cc wfff_xml.cc garmin_txt.cc gpssim.cc \
- stmsdf.cc gtrnctr.cc dmtlog.cc raymarine.cc alan.cc vitovtt.cc \
+ stmsdf.cc gtrnctr.cc dmtlog.cc raymarine.cc vitovtt.cc \
ggv_log.cc g7towin.cc garmin_gpi.cc lmx.cc random.cc xol.cc dg-100.cc \
navilink.cc mtk_logger.cc ik3d.cc osm.cc destinator.cc exif.cc vidaone.cc \
igo8.cc gopal.cc humminbird.cc mapasia.cc gnav_trl.cc navitel.cc ggv_ovl.cc \
jtr.cc sbp.cc sbn.cc mmo.cc skyforce.cc itracku.cc v900.cc \
- pocketfms_bc.cc pocketfms_fp.cc pocketfms_wp.cc naviguide.cc enigma.cc \
+ pocketfms_bc.cc pocketfms_fp.cc pocketfms_wp.cc enigma.cc \
vpl.cc teletype.cc jogmap.cc bushnell.cc bushnell_trl.cc wintec_tes.cc \
subrip.cc garmin_xt.cc garmin_fit.cc \
mtk_locus.cc googledir.cc mapbar_track.cc mapfactor.cc f90g_track.cc \
src/core/xmlstreamwriter.cc
HEADERS = \
- an1sym.h \
cet.h \
cet_util.h \
csv_util.h \
+++ /dev/null
-/*
-
- Read/write Alan Map500 Waypoints, Routes and Tracklogs.
-
- Provides "alanwpr" and "alantrl" formats for gpsbabel.
- Currently supports OS 2.xx only.
-
- Copyright (C) 2007 Gunar Megger, 0xff@quantentunnel.de
- Copyright (C) 2002-2014 Robert Lipe, robertlipe+source@gpsbabel.org
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-#include <cctype> // for isprint
-#include <cstdio> // for snprintf, sprintf, SEEK_SET, size_t
-#include <cstdint> // for int16_t, int32_t, uint8_t, uint32_t, uint16_t, int8_t
-#include <cstring> // for memset, strlen, strncpy, memcpy, strncmp
-#include <ctime> // for gmtime, time, time_t
-
-#include <QtCore/QString> // for QString
-#include <QtCore/QVector> // for QVector
-
-#include "defs.h"
-#include "gbfile.h" // for gbfwrite, gbfile, gbfread, gbfclose, gbfopen, gbfseek
-#include "src/core/datetime.h" // for DateTime
-
-#define MYNAME "alan"
-
-#define MAXWPT 1000 /* old 500 */
-
-#define MAXRTE 50 /* old 20 */
-#define MAXWPTINRTE 150 /* old 30 */
-
-#define MAXTRK 8 /* old 5 */
-#define MAXPTINTRK 2500
-
-#define WPT_NAME_LEN 8
-#define WPT_COMMENT_LEN 12
-
-#define RTE_NAME_LEN 8
-#define RTE_COMMENT_LEN 12
-
-#define TRK_NAME_LEN 12
-#define TRK_COMMENT_LEN 13
-
-struct wpthdr {
- uint32_t id;
- int16_t num;
- int16_t next;
- int16_t idx[MAXWPT];
- uint8_t used[MAXWPT];
-};
-
-struct wpt {
- char name[WPT_NAME_LEN];
- char comment[WPT_COMMENT_LEN];
- struct {
- int32_t x; /* degree * 36000 */
- int32_t y; /* degree * 36000 */
- } pt;
- int32_t date;
- int32_t time;
- int16_t usecount;
- int8_t checked;
- int8_t reserved;
-};
-
-struct rtehdr {
- uint32_t id;
- int16_t num;
- int16_t next;
- int16_t idx[MAXRTE];
- uint8_t used[MAXRTE];
- int16_t rteno;
-};
-
-struct rte {
- char name[RTE_NAME_LEN];
- char comment[RTE_COMMENT_LEN];
- int16_t wptnum;
- int16_t wptidx[MAXWPTINRTE];
- int16_t reserved;
- int32_t date;
- int32_t time;
-};
-
-struct wprdata {
- struct wpthdr wpthdr;
- struct wpt wpt[MAXWPT];
- struct rtehdr rtehdr;
- struct rte rte[MAXRTE];
-};
-
-struct trkhdr {
- int16_t totalpt;
- int16_t next;
- char name[TRK_NAME_LEN]; /* 10, null terminated */
- char comment[TRK_COMMENT_LEN]; /* 12, null terminated */
- uint8_t reserved[3];
- uint32_t occupied;
- uint32_t show;
- uint32_t fill;
-};
-
-struct loghdr {
- uint32_t id;
- int16_t num;
- int16_t next;
- int32_t date;
- int32_t time;
- struct trkhdr trkhdr[MAXTRK];
-};
-
-struct trklog {
- struct {
- int32_t x; /* degree * 36000 */
- int32_t y; /* degree * 36000 */
- } pt[MAXPTINTRK];
- struct {
- int16_t speed; /* km/h * 200 */
- int16_t height; /* m * 5 */
- } sh[MAXPTINTRK];
-};
-
-struct trldata {
- struct loghdr loghdr;
- struct trklog trklog[MAXTRK];
-};
-
-#define WPT_HDR_ID 0x5C38A600
-#define RTE_HDR_ID 0xD87F5900
-#define TRL_HDR_ID 0x38CB1200
-
-#define WPT_IDX_NONE -1 /* 0xffff */
-#define WPT_USED 0xff
-#define WPT_UNUSED 0
-#define WPT_CHECKED 1
-#define WPT_UNCHECKED 0
-
-#define RTE_IDX_NONE -1 /* 0xffff */
-#define RTE_USED 0xff
-#define RTE_UNUSED 0
-#define RTE_RTENO_NONE -1
-
-#define TRK_USED 1
-#define TRK_UNUSED 0
-#define TRK_SHOW 1
-#define TRK_HIDE 0
-#define TRK_FILL 1
-#define TRK_WRAP 0
-
-#define MAP500_PT_SCALE 36000.0
-#define pt2deg(P) ((double)(P) / MAP500_PT_SCALE)
-#define deg2pt(D) (int32_t)si_round((double)(D) * MAP500_PT_SCALE)
-
-#define MAP500_ALTITUDE_SCALE 5.0
-#define hgt2m(A) ((double)(A) / MAP500_ALTITUDE_SCALE)
-#define m2hgt(A) (int16_t)si_round((double)(A) * MAP500_ALTITUDE_SCALE)
-
-#define MAP500_SPEED_SCALE 720.0
-#define sp2mps(S) ((double)(S) / MAP500_SPEED_SCALE)
-#define mps2sp(S) (int16_t)si_round((double)(S) * MAP500_SPEED_SCALE)
-
-#define BYTEORDER_TEST 0x04030201 /* 32bit reference value */
-enum {
- SWAP_NONE = 0x1234, /* map500 regular */
- SWAP_BYTES = 0x2143, /* bytes swapped */
- SWAP_WORDS = 0x3412, /* words swapped */
- SWAP_BOTH = 0x4321 /* words + bytes swapped */
-};
-
-/**************************************************************************/
-
-static gbfile* fin = nullptr, *fout = nullptr;
-static struct wprdata WPR;
-static struct trldata TRL;
-
-static QVector<arglist_t> wpr_args = {
- /*
- {"os3", &osversion, "Operating system version 3",
- NULL, ARGTYPE_BOOL, ARGNOMINMAX },
- */
-};
-static QVector<arglist_t> trl_args = {
- /*
- {"os3", &osversion, "Operating system version 3",
- NULL, ARGTYPE_BOOL, ARGNOMINMAX },
- */
-};
-
-/**************************************************************************/
-// FIXME: Why is this code doing its own byte order conversion?
-static unsigned int byte_order()
-{
- // avoid cppcheck error: The address of local variable 'test' is accessed at non-zero index.
- // avoid undefined behavior accessing inactive union member.
- // avoid "strict aliasing" warnings.
- // see https://en.cppreference.com/w/cpp/language/reinterpret_cast#Notes
- uint32_t test = BYTEORDER_TEST;
- unsigned char ptr[4];
-
- static_assert(sizeof ptr == sizeof test, "byte order test construction failure.");
- memcpy(&ptr[0], &test, sizeof test);
-
- unsigned int order = (ptr[0] << 12) | (ptr[1] << 8) | (ptr[2] << 4) | ptr[3];
-
- return order;
-}
-
-static void sw_bytes(void* word)
-{
- auto* p = (uint8_t*) word;
- auto* r = (uint16_t*) word;
-
- *r = (uint16_t)(p[1] << 8 | p[0]);
-}
-static void sw_words(void* dword)
-{
- auto* p = (uint16_t*) dword;
- auto* r = (uint32_t*) dword;
-
- *r = (uint32_t)(p[0] << 16 | p[1]);
-}
-static void rev_bytes(void* dword)
-{
- auto* p = (uint8_t*) dword;
- auto* r = (uint32_t*) dword;
-
- *r = (uint32_t)(p[3] << 24 | p[2] << 16 | p[1] << 8 | p[0]);
-}
-
-static void swap_wpthdr(struct wpthdr* wpthdr,
- void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
- if (swap32_func != nullptr) {
- swap32_func(&wpthdr->id);
- }
- if (swap16_func != nullptr) {
- swap16_func(&wpthdr->num);
- swap16_func(&wpthdr->next);
- for (short &i : wpthdr->idx) {
- swap16_func(&i);
- }
- }
-}
-
-static void swap_wpt(struct wpt* wpt,
- void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
- if (swap16_func != nullptr) {
- swap16_func(&wpt->usecount);
- }
- if (swap32_func != nullptr) {
- swap32_func(&wpt->pt.x);
- swap32_func(&wpt->pt.y);
- swap32_func(&wpt->date);
- swap32_func(&wpt->time);
- }
-}
-
-static void swap_rtehdr(struct rtehdr* rtehdr,
- void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
- if (swap16_func != nullptr) {
- swap16_func(&rtehdr->num);
- swap16_func(&rtehdr->next);
- for (short &i : rtehdr->idx) {
- swap16_func(&i);
- }
- swap16_func(&rtehdr->rteno);
- }
- if (swap32_func != nullptr) {
- swap32_func(&rtehdr->id);
- }
-}
-
-static void swap_rte(struct rte* rte,
- void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
- if (swap16_func != nullptr) {
- swap16_func(&rte->wptnum);
- for (short &i : rte->wptidx) {
- swap16_func(&i);
- }
- swap16_func(&rte->reserved);
- }
- if (swap32_func != nullptr) {
- swap32_func(&rte->date);
- swap32_func(&rte->time);
- }
-}
-
-static void wpr_swap(struct wprdata* wprdata)
-{
- void (*swap16_func)(void*);
- void (*swap32_func)(void*);
- int i;
-
- switch (byte_order()) {
- case SWAP_NONE: /* same byte oder, LITTLE_ENDIAN */
- return;
- break;
- case SWAP_BOTH: /* swap words and bytes, BIG_ENDIAN */
- swap16_func = sw_bytes;
- swap32_func = rev_bytes;
- break;
- case SWAP_WORDS: /* swap words, PDP_ENDIAN */
- swap16_func = nullptr;
- swap32_func = sw_words;
- break;
- case SWAP_BYTES: /* swap bytes */
- swap16_func = sw_bytes;
- swap32_func = nullptr;
- break;
- default:
- return; /* never reached */
- }
-
- swap_wpthdr(&(wprdata->wpthdr), swap16_func, swap32_func);
- for (i=0; i< MAXWPT; i++) {
- swap_wpt(&(wprdata->wpt[i]), swap16_func, swap32_func);
- }
- swap_rtehdr(&(wprdata->rtehdr), swap16_func, swap32_func);
- for (i=0; i<MAXRTE; i++) {
- swap_rte(&(wprdata->rte[i]), swap16_func, swap32_func);
- }
-}
-
-static void swap_trkhdr(struct trkhdr* trkhdr,
- void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
- if (swap16_func != nullptr) {
- swap16_func(&(trkhdr->totalpt));
- swap16_func(&(trkhdr->next));
- }
- if (swap32_func != nullptr) {
- swap32_func(&(trkhdr->occupied));
- swap32_func(&(trkhdr->show));
- swap32_func(&(trkhdr->fill));
- }
-}
-
-static void swap_loghdr(struct loghdr* loghdr,
- void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
- if (swap16_func != nullptr) {
- swap16_func(&(loghdr->num));
- swap16_func(&(loghdr->next));
- }
- if (swap32_func != nullptr) {
- swap32_func(&(loghdr->id));
- swap32_func(&(loghdr->date));
- swap32_func(&(loghdr->time));
- }
- for (auto &i : loghdr->trkhdr) {
- swap_trkhdr(&i, swap16_func, swap32_func);
- }
-}
-
-static void swap_trklog(struct trklog* trklog,
- void (*swap16_func)(void*), void (*swap32_func)(void*))
-{
- int i;
-
- if (swap16_func != nullptr) {
- for (i=0; i<MAXPTINTRK; i++) {
- swap16_func(&(trklog->sh[i].speed));
- swap16_func(&(trklog->sh[i].height));
- }
- }
- if (swap32_func != nullptr) {
- for (i=0; i<MAXPTINTRK; i++) {
- swap32_func(&(trklog->pt[i].x));
- swap32_func(&(trklog->pt[i].y));
- }
- }
-}
-
-static void trl_swap(struct trldata* trldata)
-{
- void (*swap16_func)(void*);
- void (*swap32_func)(void*);
-
- switch (byte_order()) {
- case SWAP_NONE: /* same byte oder, LITTLE_ENDIAN */
- return;
- break;
- case SWAP_BOTH: /* swap words and bytes, BIG_ENDIAN */
- swap16_func = sw_bytes;
- swap32_func = rev_bytes;
- break;
- case SWAP_WORDS: /* swap words, PDP_ENDIAN */
- swap16_func = nullptr;
- swap32_func = sw_words;
- break;
- case SWAP_BYTES: /* swap bytes */
- swap16_func = sw_bytes;
- swap32_func = nullptr;
- break;
- default:
- return; /* never reached */
- }
-
- swap_loghdr(&(trldata->loghdr), swap16_func, swap32_func);
- for (auto &i : trldata->trklog) {
- swap_trklog(&i, swap16_func, swap32_func);
- }
-}
-
-
-/**************************************************************************/
-
-static void str2lab(char* dest, const char* src, int len, const char* fmt,
- int n)
-{
- int j = 0;
- if (src != nullptr) {
- for (int i=0; i<len && src[i] != '\0'; i++) {
- if (isprint(src[i])) {
- dest[j++] = src[i];
- }
- }
- }
- if (j == 0 && fmt != nullptr) {
- snprintf(dest, len, fmt, n);
- j = strlen(dest);
- }
- if (j < len) {
- memset(dest+j, ' ', len-j);
- }
-}
-
-static void str2lab(char* dest, const QString& src, int len, const char* fmt,
- int n)
-{
- str2lab(dest, CSTR(src), len, fmt, n);
-}
-
-static void pack_time(time_t t, int32_t* date, int32_t* time)
-{
- struct tm* tm = gmtime(&t);
- *date = tm->tm_mday | ((tm->tm_mon+1)<<8) | ((tm->tm_year+1900)<<16);
- *time = t % 86400;
-}
-
-static time_t unpack_time(int32_t date, int32_t time)
-{
- static int m_to_d[12] =
- {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
-
- short year = (date >> 16) & 0xffff;
- short month = (date >> 8) & 0xff; /* 1-12 */
- short day = date & 0xff; /* 1-31 */
-
- month -= 1; /* fit struct tm */
- year += month / 12;
-
- if (month < 0) {
- year -= 1;
- month += 12;
- }
- time_t result = (year - 1970) * 365 + m_to_d[month];
- if (month <= 1) {
- year -= 1;
- }
- result += (year - 1968) / 4;
- result -= (year - 1900) / 100;
- result += (year - 1600) / 400;
- result += day;
- result -= 1;
- result *= 86400;
- result += time; /* map500 time is inseconds of the day */
-
- return result;
-}
-
-/**************************************************************************/
-
-static Waypoint* get_wpt(struct wprdata* wprdata, unsigned n)
-{
- int j;
-
- struct wpthdr* wpthdr = &(wprdata->wpthdr);
- int idx = wpthdr->idx[n];
-
- if (idx == WPT_IDX_NONE || wpthdr->used[idx] == WPT_UNUSED) {
- return nullptr;
- }
- struct wpt* wpt = &(wprdata->wpt[idx]);
-
- auto* WP = new Waypoint;
- WP->latitude = -pt2deg(wpt->pt.y);
- WP->longitude = pt2deg(wpt->pt.x);
- WP->SetCreationTime(unpack_time(wpt->date, wpt->time));
- for (j=WPT_NAME_LEN-1; j >= 0 && wpt->name[j] == ' '; j--) {}
- char *s = xstrndup(wpt->name,j+1);
- WP->shortname = s;
- xfree(s);
- for (j=WPT_COMMENT_LEN-1; j >= 0 && wpt->comment[j] == ' '; j--) {}
- if (j >= 0) {
- char *descr = xstrndup(wpt->comment, j+1);
- WP->description = descr;
- xfree(descr);
- } else {
- WP->description = "";
- }
- WP->notes = "";
-
- return WP;
-}
-
-static void wpr_read()
-{
- struct wprdata wprdata;
- int i, j;
- Waypoint* WP;
-
- if (gbfread(&wprdata, sizeof(struct wprdata), 1, fin) != 1) {
- fatal(MYNAME ": Read error on '%s'. Perhaps this isn't an alan file\n", fin->name);
- }
- wpr_swap(&wprdata);
- if (wprdata.wpthdr.id != WPT_HDR_ID ||
- wprdata.rtehdr.id != RTE_HDR_ID) {
- fatal(MYNAME ": %s is not in Alan .wpr format.\n", fin->name);
- }
-
- /* waypoints */
- for (i=0; i<MAXWPT; i++) {
- WP = get_wpt(&wprdata, i);
- if (WP != nullptr) {
- waypt_add(WP);
- }
- }
-
- /* routes */
- struct rtehdr* rtehdr = &(wprdata.rtehdr);
- for (i=0; i<MAXRTE; i++) {
- int idx = rtehdr->idx[i];
- if (idx == RTE_IDX_NONE || rtehdr->used[idx] == RTE_UNUSED) {
- continue;
- }
- struct rte* rte = &(wprdata.rte[idx]);
-
- auto* RT = new route_head;
- RT->rte_num = i;
- for (j=RTE_NAME_LEN-1; j >= 0 && rte->name[j] == ' '; j--) {}
- char *s = xstrndup(rte->name,j+1);
- RT->rte_name = s;
- xfree(s);
- for (j=RTE_COMMENT_LEN-1; j >= 0 && rte->comment[j] == ' '; j--) {}
- if (j >= 0) {
- char *desc = xstrndup(rte->comment,j+1);
- RT->rte_desc = desc;
- xfree(desc);
- } else {
- RT->rte_desc = "";
- }
-
- route_add_head(RT);
-
- /* route points */
- for (j=0; j<rte->wptnum; j++) {
- WP = get_wpt(&wprdata, rte->wptidx[j]);
- if (WP != nullptr) {
- route_add_wpt(RT, WP);
- }
- }
- }
-}
-
-static void trl_read()
-{
- struct trldata trldata;
- int i, j;
-
- for (i=0; i<MAXTRK; i+=2) {
- gbfseek(fin, 0x10000 * (i/2), SEEK_SET);
- if (gbfread(&(trldata.trklog[i]), sizeof(struct trklog), 2, fin) != 2) {
- fatal(MYNAME ": Read error on '%s'. Perhaps this isn't an alan file.\n", fin->name);
- }
- }
- gbfseek(fin, 0x10000 * MAXTRK/2, SEEK_SET);
- if (gbfread(&(trldata.loghdr), sizeof(struct loghdr), 1, fin) != 1) {
- fatal(MYNAME ": Read error on '%s'. Perhaps this isn't an alan file.\n", fin->name);
- }
- trl_swap(&trldata);
- if (trldata.loghdr.id != TRL_HDR_ID) {
- fatal(MYNAME ": %s is not in Alan .trl format.\n", fin->name);
- }
-
- for (i=0; i<MAXTRK; i++) {
- /* track header */
- struct trkhdr* trkhdr = &(trldata.loghdr.trkhdr[i]);
- if (trkhdr->occupied == TRK_UNUSED) {
- continue;
- }
- auto* TL = new route_head;
- for (j=TRK_NAME_LEN-1;
- j >= 0 && (trkhdr->name[j] == ' ' || trkhdr->name[j] == '\0');
- j--) {}
- char *s1 = xstrndup(trkhdr->name,j+1);
- TL->rte_name = s1;
- xfree(s1);
- /* TL->rte_name[TRK_NAME_LEN+1] = 0; */ /* MAYBE BAD ADDRESS (Valgrind) */
- for (j=TRK_COMMENT_LEN-1;
- j >= 0 && (trkhdr->comment[j] == ' ' || trkhdr->comment[j] == '\0');
- j--) {}
- s1 = xstrndup(trkhdr->comment,j+1);
- TL->rte_desc = s1;
- xfree(s1);
- /* TL->rte_desc[TRK_COMMENT_LEN+1] = 0; */ /* MAYBE BAD ADDRESS (Valgrind) */
- TL->rte_num = i;
-
- track_add_head(TL);
-
- /* track points */
- struct trklog* trklog = &(trldata.trklog[i]);
- for (j=0; j<trkhdr->totalpt; j++) {
- auto* WP = new Waypoint;
- WP->latitude = -pt2deg(trklog->pt[j].y);
- WP->longitude = pt2deg(trklog->pt[j].x);
- WP->altitude = hgt2m(trklog->sh[j].height);
- if (trklog->sh[j].speed >= 0)
- WAYPT_SET(WP, speed, sp2mps(trklog->sh[j].speed));
- else { /* bad speed < 0 - set to 0.0 */
- WAYPT_UNSET(WP, speed);
- }
- track_add_wpt(TL, WP);
- }
- }
-}
-
-/**************************************************************************/
-
-static int find_wpt(struct wprdata* wprdata, const Waypoint* WP)
-{
- struct wpt pattern;
-
- str2lab(pattern.name, WP->shortname, WPT_NAME_LEN, nullptr, 0);
- pattern.pt.x = deg2pt(WP->longitude);
- pattern.pt.y = deg2pt(-WP->latitude);
-
- struct wpt* wpt = wprdata->wpt;
- for (int i = 0; i<MAXWPT; i++) {
- int wpt_idx = wprdata->wpthdr.idx[i];
- if (wpt_idx == WPT_IDX_NONE ||
- wprdata->wpthdr.used[wpt_idx] == WPT_UNUSED) {
- continue;
- }
- if (strncmp(wpt[wpt_idx].name, pattern.name, WPT_NAME_LEN) == 0 &&
- wpt[wpt_idx].pt.x == pattern.pt.x &&
- wpt[wpt_idx].pt.y == pattern.pt.y) {
- return i;
- }
- }
-
- return -1;
-}
-
-static int add_wpt(struct wprdata* wprdata, const Waypoint* WP,int isroute)
-{
- struct wpt* wpt;
- int i;
-
- struct wpthdr* wpthdr = &(wprdata->wpthdr);
-
- int hdr_idx = find_wpt(wprdata, WP);
- if (hdr_idx >= 0) {
- /* duplicate waypoint */
- if (isroute) {
- wpt = &(wprdata->wpt[wpthdr->idx[hdr_idx]]);
- wpt->usecount ++;
- }
- return hdr_idx;
- }
-
- for (i=0; i<MAXWPT && wpthdr->idx[i] != WPT_IDX_NONE; i++) { }
- hdr_idx = i;
- for (i=0; i<MAXWPT && wpthdr->used[i] != WPT_UNUSED; i++) { }
- int wpt_idx = i;
- if (wpthdr->num >= MAXWPT || hdr_idx >= MAXWPT || wpt_idx >= MAXWPT) {
- fatal(MYNAME ": Can't store more than %u waypoints\n", MAXWPT);
- }
-
- wpt = &(wprdata->wpt[wpt_idx]);
- str2lab(wpt->name, WP->shortname, WPT_NAME_LEN, "W%05d", wpt_idx);
- str2lab(wpt->comment, WP->description, WPT_COMMENT_LEN, nullptr, 0);
- wpt->pt.x = deg2pt(WP->longitude);
- wpt->pt.y = deg2pt(-WP->latitude);
- wpt->usecount = isroute ? 1 : 0;
- wpt->checked = isroute ? 0 : 1;
- wpt->reserved = 0;
- pack_time(WP->GetCreationTime().toTime_t(), &(wpt->date), &(wpt->time));
-
- wpthdr->idx[hdr_idx] = wpt_idx;
- wpthdr->used[wpt_idx] = WPT_USED;
- wpthdr->num++;
- wpthdr->next++;
- if (wpthdr->next >= MAXWPT) { /* overrun */
- wpthdr->next = 0;
- }
-
- return hdr_idx;
-}
-
-static void wpr_waypoint(const Waypoint* WP)
-{
- add_wpt(&WPR, WP, 0);
-}
-
-static void wpr_route_hdr(const route_head* RT)
-{
- int i;
-
- struct rtehdr* rtehdr = &(WPR.rtehdr);
- for (i=0; i<MAXRTE && rtehdr->idx[i] != RTE_IDX_NONE; i++) { }
- int hdr_idx = i;
- for (i=0; i<MAXRTE && rtehdr->used[i] != RTE_UNUSED; i++) { }
- int rte_idx = i;
- if (rtehdr->num >= MAXRTE || hdr_idx >= MAXRTE || rte_idx >= MAXRTE) {
- fatal(MYNAME ": Can't store more than %u routes", MAXRTE);
- }
-
- struct rte* rte = &(WPR.rte[rte_idx]);
- str2lab(rte->name, RT->rte_name, RTE_NAME_LEN, "R%03d", rte_idx);
- str2lab(rte->comment, RT->rte_desc, RTE_COMMENT_LEN, nullptr, 0);
- pack_time(time(nullptr), &(rte->date), &(rte->time));
-
- rtehdr->idx[hdr_idx] = rte_idx;
- rtehdr->used[rte_idx] = RTE_USED;
- rtehdr->num++;
- rtehdr->next++;
- if (rtehdr->next >= MAXRTE) { /* overrun */
- rtehdr->next = 0;
- }
-
- /* if you want the new route to be active, uncomment the next line */
- /* rtehdr->rteno = rte_idx; */
-}
-
-static void wpr_route_wpt(const Waypoint* WP)
-{
- struct rte* rte = &(WPR.rte[WPR.rtehdr.num -1]);
- if (rte->wptnum >= MAXWPTINRTE) {
- fatal(MYNAME ": Can't store more than %u waypoints per route", MAXWPTINRTE);
- }
-
- int wpt_idx = add_wpt(&WPR, WP, 1);
-
- rte->wptidx[rte->wptnum] = wpt_idx;
- rte->wptnum ++;
-}
-
-static void wpr_route_trl(const route_head*)
-{
- /* should we do some final sanity checks? */
-}
-
-static void wpr_write()
-{
- int i;
-
- WPR.wpthdr.id = WPT_HDR_ID;
- WPR.wpthdr.num = WPR.wpthdr.next = 0;
- for (i=0; i<MAXWPT; i++) {
- WPR.wpthdr.idx[i] = WPT_IDX_NONE;
- WPR.wpthdr.used[i] = WPT_UNUSED;
- }
- memset(WPR.wpt, 0, MAXWPT * sizeof(struct wpt));
- WPR.rtehdr.id = RTE_HDR_ID;
- WPR.rtehdr.num = WPR.rtehdr.next = 0;
- for (i=0; i<MAXRTE; i++) {
- WPR.rtehdr.idx[i] = RTE_IDX_NONE;
- WPR.rtehdr.used[i] = RTE_UNUSED;
- }
- WPR.rtehdr.rteno = RTE_RTENO_NONE;
- memset(WPR.rte, 0, MAXRTE * sizeof(struct rte));
-
- waypt_disp_all(wpr_waypoint);
- route_disp_all(wpr_route_hdr, wpr_route_trl, wpr_route_wpt);
-
- wpr_swap(&WPR);
- if (gbfwrite(&WPR, sizeof(struct wprdata), 1, fout) != 1) {
- fatal(MYNAME ": Write error on %s\n", fout->name);
- }
-}
-
-/**************************************************************************/
-
-static void trl_track_hdr(const route_head* TL)
-{
- int idx;
-
- struct trkhdr* trkhdr = TRL.loghdr.trkhdr;
-
- for (idx=0; idx< MAXTRK && trkhdr[idx].occupied != TRK_UNUSED; idx++) {}
- if (idx >= MAXTRK) {
- fatal(MYNAME ": Can't store more than %u tracklogs", MAXTRK);
- }
-
- if (!TL->rte_name.isEmpty()) {
- strncpy(trkhdr[idx].name, CSTRc(TL->rte_name), TRK_NAME_LEN - 1);
- }
- if (*(trkhdr[idx].name) == '\0') {
- sprintf(trkhdr[idx].name, "T%03d", idx);
- }
- trkhdr[idx].name[TRK_NAME_LEN-1] = '\0';
-
- if (!TL->rte_desc.isEmpty()) {
- strncpy(trkhdr[idx].comment, CSTRc(TL->rte_desc), TRK_COMMENT_LEN - 1);
- int l = strlen(CSTRc(TL->rte_desc));
- if (l < TRK_COMMENT_LEN-1) {
- memset(trkhdr[idx].comment + l, ' ', TRK_COMMENT_LEN - 1 - l);
- }
- }
- trkhdr[idx].comment[TRK_COMMENT_LEN-1] = '\0';
-
- trkhdr[idx].occupied = TRK_USED;
- trkhdr[idx].totalpt = 0;
- trkhdr[idx].next = 0;
-
- TRL.loghdr.num = idx;
-}
-
-static void trl_track_wpt(const Waypoint* WP)
-{
- int trk_idx = TRL.loghdr.num;
-
- struct trkhdr* trkhdr = &(TRL.loghdr.trkhdr[trk_idx]);
- if (trkhdr->totalpt >= MAXPTINTRK) {
- fatal(MYNAME ": Can't store more than %u points per track", MAXPTINTRK);
- }
- int log_idx = trkhdr->next;
-
- struct trklog* trklog = &(TRL.trklog[trk_idx]);
- trklog->pt[log_idx].x = deg2pt(WP->longitude);
- trklog->pt[log_idx].y = deg2pt(-WP->latitude);
- if WAYPT_HAS(WP, speed) {
- trklog->sh[log_idx].speed = mps2sp(WP->speed);
- }
- if (WP->altitude != unknown_alt) {
- trklog->sh[log_idx].height = m2hgt(WP->altitude);
- }
-
- trkhdr->totalpt ++;
- trkhdr->next = trkhdr->totalpt;
-}
-
-static void trl_track_tlr(const route_head*)
-{
- int trk_idx = TRL.loghdr.num;
- struct trkhdr* trkhdr = &(TRL.loghdr.trkhdr[trk_idx]);
-
- if (trkhdr->totalpt == 0) {
- trkhdr->occupied = TRK_UNUSED;
- }
-
- TRL.loghdr.num = -1;
-}
-
-static void trl_write()
-{
- int i;
-
- TRL.loghdr.id = TRL_HDR_ID;
- TRL.loghdr.num = TRL.loghdr.next = -1;
- TRL.loghdr.date = TRL.loghdr.time = 0;
- for (i=0; i<MAXTRK; i++) {
- struct trkhdr* trkhdr = &(TRL.loghdr.trkhdr[i]);
- trkhdr->totalpt = 0;
- trkhdr->next = 0;
- memset(trkhdr->name, 0, TRK_NAME_LEN);
- memset(trkhdr->comment, ' ', TRK_COMMENT_LEN);
- trkhdr->comment[TRK_COMMENT_LEN-1] = '\0';
- trkhdr->occupied = TRK_UNUSED;
- trkhdr->show = TRK_HIDE;
- trkhdr->fill = TRK_FILL;
- }
- memset(TRL.trklog, 0xff, sizeof(struct trklog) * MAXTRK);
-
- track_disp_all(trl_track_hdr, trl_track_tlr, trl_track_wpt);
-
- trl_swap(&TRL);
-
- size_t fill = 0x10000 - 2 * sizeof(struct trklog);
- void* buf = xmalloc(fill);
- if (buf == nullptr) {
- fatal(MYNAME ": Not enough memory\n");
- }
- memset(buf, 0xff, fill);
-
- for (i=0; i<MAXTRK; i+=2) {
- if (gbfwrite(&(TRL.trklog[i]), sizeof(struct trklog), 2, fout) != 2 ||
- gbfwrite(buf, fill, 1, fout) != 1) {
- fatal(MYNAME ": Write error on %s\n", fout->name);
- }
- }
- xfree(buf);
-
- fill = 0x1000 - sizeof(struct loghdr);
- buf = xmalloc(fill);
- if (buf == nullptr) {
- fatal(MYNAME ": Not enough memory\n");
- }
- memset(buf, 0xff, fill);
-
- if (gbfwrite(&(TRL.loghdr), sizeof(struct loghdr), 1, fout) != 1 ||
- gbfwrite(buf, fill, 1, fout) != 1) {
- fatal(MYNAME ": Write error on %s\n", fout->name);
- }
- xfree(buf);
-}
-
-/**************************************************************************/
-
-static void alan_rd_init(const QString& fname)
-{
- fin = gbfopen(fname, "rb", MYNAME);
-}
-
-static void alan_rd_deinit()
-{
- gbfclose(fin);
- fin = nullptr;
-}
-
-
-static void alan_wr_init(const QString& fname)
-{
- fout = gbfopen(fname, "wb", MYNAME);
-}
-
-static void alan_wr_deinit()
-{
- gbfclose(fout);
- fout = nullptr;
-}
-
-/**************************************************************************/
-
-ff_vecs_t alanwpr_vecs = {
- ff_type_file,
- {
- (ff_cap)(ff_cap_read | ff_cap_write) /* waypoints */,
- ff_cap_none /* tracks */,
- (ff_cap)(ff_cap_read | ff_cap_write) /* routes */
- },
- alan_rd_init,
- alan_wr_init,
- alan_rd_deinit,
- alan_wr_deinit,
- wpr_read,
- wpr_write,
- nullptr,
- &wpr_args,
- CET_CHARSET_ASCII, 0, /* ascii is the expected character set */
- /* not fixed, can be changed through command line parameter */
- NULL_POS_OPS,
- nullptr
-};
-
-ff_vecs_t alantrl_vecs = {
- ff_type_file,
- {
- ff_cap_none /* waypoints */,
- (ff_cap)(ff_cap_read | ff_cap_write) /* tracks */,
- ff_cap_none /* routes */
- },
- alan_rd_init,
- alan_wr_init,
- alan_rd_deinit,
- alan_wr_deinit,
- trl_read,
- trl_write,
- nullptr,
- &trl_args,
- CET_CHARSET_ASCII, 0, /* ascii is the expected character set */
- /* not fixed, can be changed through command line parameter */
- NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-/*
- Read DeLorme drawing files (.an1)
-
- Copyright (C) 2005-2014 Ron Parker and Robert Lipe.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-#include <cstdio> // for sprintf, SEEK_CUR
-#include <cstdint> // for int32_t
-#include <cstdlib> // for atoi, atof
-#include <cstring> // for strlen, strchr, memcpy, strstr
-
-#include <QtCore/QString> // for QString
-#include <QtCore/QVector> // for QVector
-
-#include "defs.h"
-#include "formspec.h" // for FsChainAdd, FsChainFind, FormatSpecificData, kFsAn1L, kFsAn1V, kFsAn1W
-#include "gbfile.h" // for gbfgetint32, gbfputint32, gbfputint16, gbfgetint16, gbfile, gbfputs, gbfgetc, gbfputc, gbfclose, gbfopen_le, gbfgetdbl, gbfputdbl, gbfread, gbfseek
-#include "src/core/datetime.h" // for DateTime
-
-
-#define MYNAME "an1"
-
-static gbfile* infile;
-static gbfile* outfile;
-
-static char* output_type = nullptr;
-static char* road_changes = nullptr;
-static char* nogc = nullptr;
-static char* nourl = nullptr;
-static char* opt_symbol = nullptr;
-static char* opt_color = nullptr;
-static char* opt_zoom = nullptr;
-static char* opt_wpt_type = nullptr;
-static char* opt_radius = nullptr;
-
-static short output_type_num = 0;
-static short opt_zoom_num = 0;
-static long opt_color_num = 0;
-static short wpt_type_num = 0;
-static short last_read_type = 0;
-static double radius = 0.0;
-
-static long serial=10000;
-static long rtserial=1;
-
-struct roadchange {
- long type;
- char* name;
-};
-
-static roadchange* roadchanges = nullptr;
-
-static
-QVector<arglist_t> an1_args = {
- {
- "type", &output_type, "Type of .an1 file",
- "", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "road", &road_changes, "Road type changes",
- "", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "nogc", &nogc, "Do not add geocache data to description",
- nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
- },
- {
- "nourl", &nourl, "Do not add URLs to description",
- nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
- },
- {
- "deficon", &opt_symbol, "Symbol to use for point data",
- "Red Flag", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "color", &opt_color, "Color for lines or mapnotes",
- "red", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "zoom", &opt_zoom, "Zoom level to reduce points",
- nullptr, ARGTYPE_INT, ARG_NOMINMAX, nullptr
- },
- {
- "wpt_type", &opt_wpt_type,
- "Waypoint type",
- "", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "radius", &opt_radius, "Radius for circles",
- nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
-};
-
-struct guid_t {
- unsigned long l;
- unsigned short s[3];
- unsigned char c[6];
-};
-
-#include "an1sym.h"
-
-#define ReadShort(f) gbfgetint16(f)
-#define WriteShort(f,s) gbfputint16((s),f)
-#define ReadLong(f) gbfgetint32(f)
-#define WriteLong(f,l) gbfputint32((l),f)
-#define ReadDouble(f) gbfgetdbl(f)
-#define WriteDouble(f,d) gbfputdbl((d),f)
-
-static char*
-ReadString(gbfile* f, short len)
-{
- auto* result = (char*)xcalloc(1, len + 1);
- if (len) {
- gbfread(result, 1, len, f);
- }
- return result;
-}
-
-#define ReadChar(f) (unsigned char) gbfgetc(f)
-#define WriteChar(f,c) gbfputc((unsigned char)(c),f)
-#define WriteString(f,s) gbfputs((s),f)
-
-static void
-ReadGuid(gbfile* f, guid_t* guid)
-{
- guid->l = ReadLong(f);
- for (unsigned short& i : guid->s) {
- i = ReadShort(f);
- }
- for (unsigned char& i : guid->c) {
- i = ReadChar(f);
- }
-}
-
-static void
-WriteGuid(gbfile* f, guid_t* guid)
-{
- WriteLong(f, guid->l);
- for (int i = 0; i < 3; i++) {
- WriteShort(f, guid->s[i]);
- }
- for (int i = 0; i < 6; i++) {
- WriteChar(f, guid->c[i]);
- }
-}
-
-static void
-Skip(gbfile* f,
- unsigned long distance)
-{
- gbfseek(f, distance, SEEK_CUR);
-}
-
-static double
-DecodeOrd(long ord)
-{
- return (double)((int32_t)(0x80000000 - ord)) / 0x800000;
-}
-
-static long
-EncodeOrd(double ord)
-{
- return (int32_t)(0x80000000 - (int32_t)(ord * 0x800000));
-}
-
-struct an1_symbol_record {
- short hotspotxhi{0};
- long hotspoty{0};
- long unk1{0};
- guid_t guid{};
- char* name{nullptr};
-};
-
-struct an1_waypoint_record : FormatSpecificData {
- an1_waypoint_record() : FormatSpecificData(kFsAn1W) {}
-private:
- an1_waypoint_record(const an1_waypoint_record&) = default;
-public:
- an1_waypoint_record& operator=(const an1_waypoint_record&) = delete;
- an1_waypoint_record(an1_waypoint_record&&) = delete;
- an1_waypoint_record& operator=(an1_waypoint_record&&) = delete;
- ~an1_waypoint_record() override
- {
- xfree(name);
- xfree(fontname);
- xfree(url);
- xfree(comment);
- xfree(image_name);
- }
-
- an1_waypoint_record* clone() const override
- {
- auto* copy = new an1_waypoint_record(*this);
- copy->name = xstrdup(name);
- copy->fontname = xstrdup(fontname);
- copy->url = xstrdup(url);
- copy->comment = xstrdup(comment);
- copy->image_name = xstrdup(image_name);
- return copy;
- }
-
- short magic{0};
- long unk1{0};
- long lon{0};
- long lat{0};
- short type{0};
- long height{0};
- long width{0};
- short unk2{0};
- short unk3{0};
- short serial{0};
- short unk4{0};
- unsigned char create_zoom{0};
- unsigned char visible_zoom{0};
- short unk5{0};
- double radius{0.0}; /* in km */
- char* name{nullptr};
- char* fontname{nullptr};
- guid_t guid{};
- long fontcolor{0};
- long fontstyle{0};
- long fontsize{0};
- long outlineweight{0};
- long outlinecolor{0};
- long outlineflags{0};
- long fillcolor{0};
- long unk6{0};
- long fillflags{0};
-
- /* Added in SA2006/Topo 6.0 */
- short unk6_1{0};
- char* url{nullptr};
- char* comment{nullptr};
- long creation_time{0};
- long modification_time{0};
- char* image_name{nullptr};
-};
-
-struct an1_vertex_record : FormatSpecificData {
- an1_vertex_record() : FormatSpecificData(kFsAn1V) {}
- an1_vertex_record* clone() const override
- {
- return new an1_vertex_record(*this);
- }
-
- short magic{0};
- long unk0{0};
- long lon{0};
- long lat{0};
- short unk1{0};
-};
-
-struct an1_line_record : FormatSpecificData {
- an1_line_record() : FormatSpecificData(kFsAn1L) {}
-private:
- an1_line_record(const an1_line_record&) = default;
-public:
- an1_line_record& operator=(const an1_line_record&) = delete;
- an1_line_record(an1_line_record&&) = delete;
- an1_line_record& operator=(an1_line_record&&) = delete;
- ~an1_line_record() override
- {
- xfree(name);
- }
-
- an1_line_record* clone() const override
- {
- auto* copy = new an1_line_record(*this);
- copy->name = xstrdup(name);
- return copy;
- }
-
- long roadtype{0};
- short serial{0};
- long unk2{0};
- short unk3{0};
- short type{0};
- long unk4{0};
- char* name{nullptr};
- long lineweight{0};
- long linestyle{0};
- long linecolor{0};
- long opacity{0};
- long polyfillcolor{0};
- long unk6{0};
- long unk7{0};
- short unk8{0};
- long pointcount{0};
-};
-
-static void Destroy_AN1_Symbol(an1_symbol_record* symbol)
-{
- xfree(symbol->name);
-}
-
-static void Read_AN1_Waypoint(gbfile* f, an1_waypoint_record* wpt)
-{
- wpt->magic = ReadShort(f);
- wpt->unk1 = ReadLong(f);
- wpt->lon = ReadLong(f);
- wpt->lat = ReadLong(f);
- wpt->type = ReadShort(f);
- wpt->height = ReadLong(f);
- wpt->width = ReadLong(f);
- wpt->unk2 = ReadShort(f);
- wpt->unk3 = ReadShort(f);
- wpt->serial = ReadShort(f);
- wpt->unk4 = ReadShort(f);
- wpt->create_zoom = ReadChar(f);
- wpt->visible_zoom = ReadChar(f);
- wpt->unk5 = ReadShort(f);
- wpt->radius = ReadDouble(f);
- unsigned short len = ReadShort(f);
- wpt->name = ReadString(f, len);
-
- if (len != strlen(wpt->name)) {
- /* This happens in 06/6.0 files that put extra data in the
- * name record for backward compatibility's sake */
- char* ofs = wpt->name + strlen(wpt->name) + 1;
- wpt->unk6_1 = le_read16(ofs);
- ofs += 2;
-
- len = le_read16(ofs);
- ofs += 2;
-
- if (len) {
- /*
- * Trust URL encoded in new format over one in
- * old format if both are present. Whack the
- * name starting at '{URL='.
- */
- char* oldurlstr = strstr(wpt->name, "{URL=");
- if (oldurlstr) {
- *oldurlstr = 0;
- }
- wpt->url = (char*) xcalloc(len+1, 1);
- memcpy(wpt->url, ofs, len);
- ofs += len;
- }
-
- len = le_read16(ofs);
- ofs += 2;
-
- if (len) {
- wpt->comment = (char*) xcalloc(len+1, 1);
- memcpy(wpt->comment, ofs, len);
- ofs += len;
- }
-
- /* these are quadwords, presumably for year-2038 compat. */
- wpt->creation_time = le_read32(ofs);
- ofs += 8;
-
- wpt->modification_time = le_read32(ofs);
- ofs += 8;
- }
-
- if (wpt->type == 0x12) {
- /* 'image' type */
- ReadShort(f); /* length of font + filename */
- len = ReadShort(f);
- wpt->fontname = ReadString(f, len);
- len = ReadShort(f);
- wpt->image_name = ReadString(f, len);
- } else {
- len = ReadShort(f);
- wpt->fontname = ReadString(f, len);
- wpt->image_name = nullptr;
- }
- ReadGuid(f, &wpt->guid);
- wpt->fontcolor = ReadLong(f);
- wpt->fontstyle = ReadLong(f);
- wpt->fontsize = ReadLong(f);
- wpt->outlineweight = ReadLong(f);
- wpt->outlinecolor = ReadLong(f);
- wpt->outlineflags = ReadLong(f);
- wpt->fillcolor = ReadLong(f);
- wpt->unk6 = ReadLong(f);
- wpt->fillflags = ReadLong(f);
-}
-
-static void Write_AN1_Waypoint(gbfile* f, an1_waypoint_record* wpt)
-{
- WriteShort(f, wpt->magic);
- WriteLong(f, wpt->unk1);
- WriteLong(f, wpt->lon);
- WriteLong(f, wpt->lat);
- WriteShort(f, wpt->type);
- WriteLong(f, wpt->height);
- WriteLong(f, wpt->width);
- WriteShort(f, wpt->unk2);
- WriteShort(f, wpt->unk3);
- WriteShort(f, wpt->serial);
- WriteShort(f, wpt->unk4);
- WriteChar(f, wpt->create_zoom);
- WriteChar(f, wpt->visible_zoom);
- WriteShort(f, wpt->unk5);
- WriteDouble(f, wpt->radius);
-
- short len = strlen(wpt->name) + 1 + 2 + 2 +
- (wpt->url ? strlen(wpt->url) : 0) + 2 +
- (wpt->comment ? strlen(wpt->comment) : 0) + 8 + 8;
- WriteShort(f, len);
- WriteString(f, wpt->name);
- WriteChar(f, 0); /* name string terminator */
-
- WriteShort(f, wpt->unk6_1);
-
- if (wpt->url) {
- WriteShort(f, strlen(wpt->url));
- WriteString(f, wpt->url);
- } else {
- WriteShort(f, 0);
- }
-
- if (wpt->comment) {
- WriteShort(f, strlen(wpt->comment));
- WriteString(f, wpt->comment);
- } else {
- WriteShort(f, 0);
- }
-
- WriteLong(f, wpt->creation_time);
- WriteLong(f, 0);
-
- WriteLong(f, wpt->modification_time);
- WriteLong(f, 0);
-
- if (wpt->type == 0x12) { /* image */
- len = 2 + (wpt->fontname ? strlen(wpt->fontname) : 0) +
- 2 + (wpt->image_name ? strlen(wpt->image_name) : 0);
- WriteShort(f, len);
- if (wpt->fontname) {
- len = strlen(wpt->fontname);
- WriteShort(f, len);
- WriteString(f, wpt->fontname);
- } else {
- WriteShort(f, 0);
- }
- if (wpt->image_name) {
- len = strlen(wpt->image_name);
- WriteShort(f, len);
- WriteString(f, wpt->image_name);
- } else {
- WriteShort(f, 0);
- }
- } else {
- len = strlen(wpt->fontname);
- WriteShort(f, len);
- WriteString(f, wpt->fontname);
- }
- WriteGuid(f, &wpt->guid);
- WriteLong(f, wpt->fontcolor);
- WriteLong(f, wpt->fontstyle);
- WriteLong(f, wpt->fontsize);
- WriteLong(f, wpt->outlineweight);
- WriteLong(f, wpt->outlinecolor);
- WriteLong(f, wpt->outlineflags);
- WriteLong(f, wpt->fillcolor);
- WriteLong(f, wpt->unk6);
- WriteLong(f, wpt->fillflags);
-}
-
-static void Read_AN1_Vertex(gbfile* f, an1_vertex_record* vertex)
-{
-
- vertex->magic = ReadShort(f);
- vertex->unk0 = ReadLong(f);
- vertex->lon = ReadLong(f);
- vertex->lat = ReadLong(f);
- vertex->unk1 = ReadShort(f);
-}
-
-static void Write_AN1_Vertex(gbfile* f, an1_vertex_record* vertex)
-{
- WriteShort(f, vertex->magic);
- WriteLong(f, vertex->unk0);
- WriteLong(f, vertex->lon);
- WriteLong(f, vertex->lat);
- WriteShort(f, vertex->unk1);
-}
-
-static void Read_AN1_Line(gbfile* f, an1_line_record* line)
-{
- line->roadtype = ReadLong(f);
- line->serial = ReadShort(f);
- line->unk2 = ReadLong(f);
- line->unk3 = ReadShort(f);
- line->type = ReadShort(f);
- line->unk4 = ReadLong(f);
- short len = ReadShort(f);
- line->name = ReadString(f, len);
- line->lineweight = ReadShort(f);
- line->linestyle = ReadLong(f);
- line->linecolor = ReadLong(f);
- line->opacity = ReadLong(f);
- line->polyfillcolor = ReadLong(f);
- line->unk6 = ReadLong(f);
- line->unk7 = ReadLong(f);
- line->unk8 = ReadShort(f);
- line->pointcount = ReadLong(f);
-}
-
-static void Write_AN1_Line(gbfile* f, an1_line_record* line)
-{
- WriteLong(f, line->roadtype);
- WriteShort(f, line->serial);
- WriteLong(f, line->unk2);
- WriteShort(f, line->unk3);
- WriteShort(f, line->type);
- WriteLong(f, line->unk4);
- short len = strlen(line->name);
- WriteShort(f, len);
- WriteString(f, line->name);
- WriteShort(f, (short) line->lineweight);
- WriteLong(f, line->linestyle);
- WriteLong(f, line->linecolor);
- WriteLong(f, line->opacity);
- WriteLong(f, line->polyfillcolor);
- WriteLong(f, line->unk6);
- WriteLong(f, line->unk7);
- WriteShort(f, line->unk8);
- WriteLong(f, line->pointcount);
-}
-
-static void Skip_AN1_IL(gbfile* f)
-{
- Skip(f, 26);
-}
-
-static void Skip_AN1_BM(gbfile* f)
-{
- Skip(f, 8); /* BITMAPFILEHEADER fields 1-3 */
- unsigned long bitoffset = ReadLong(f);
-
- unsigned long bmisize = ReadLong(f);
- Skip(f, 16); /* BITMAPINFOHEADER fields 2-6 */
- unsigned long bmsize = ReadLong(f);
- Skip(f, 16); /* BITMAPINFOHEADER fields 8-11 */
-
- unsigned long palettesize = bitoffset - bmisize - 14;
- Skip(f, bmsize + palettesize);
-}
-
-static void Read_AN1_Symbol(gbfile* f, an1_symbol_record* symbol)
-{
- /* This is just the high word of a long; we ate the low
- * word in the caller. Fortunately, we don't care. */
- symbol->hotspotxhi = ReadShort(f);
- symbol->hotspoty = ReadLong(f);
- symbol->unk1 = ReadLong(f);
- ReadGuid(f, &symbol->guid);
- short len = ReadChar(f);
- symbol->name = ReadString(f, len);
-}
-
-static void Read_AN1_Header(gbfile* f)
-{
- unsigned short magic = ReadShort(f);
- (void) magic; // hush warning.
- unsigned short type = ReadShort(f);
-
- last_read_type = type;
-}
-
-static void Write_AN1_Header(gbfile* f)
-{
- WriteShort(f, 11557);
- WriteShort(f, output_type_num);
-}
-
-static void Read_AN1_Bitmaps(gbfile* f)
-{
- an1_symbol_record symbol;
-
- long count = ReadLong(f);
-
- while (count) {
- unsigned short magic = ReadShort(f);
- switch (magic) {
- case 0x4d42:
- Skip_AN1_BM(f);
- break;
- case 0x4c49:
- Skip_AN1_IL(f);
- break;
- default:
- Read_AN1_Symbol(f, &symbol);
- Destroy_AN1_Symbol(&symbol);
- count--;
- break;
- }
- }
-
- /* Read the symbol table */
-}
-
-static void Write_AN1_Bitmaps(gbfile* f)
-{
- /* On write, we don't output any bitmaps, so writing them
- * is just a matter of writing a count of zero */
- WriteLong(f, 0);
-}
-
-static void Read_AN1_Waypoints(gbfile* f)
-{
- const char* icon = nullptr;
- ReadShort(f);
- unsigned long count = ReadLong(f);
- for (unsigned long i = 0; i < count; i++) {
- auto* rec = new an1_waypoint_record;
- Read_AN1_Waypoint(f, rec);
- auto* wpt_tmp = new Waypoint;
-
- if (rec->creation_time) {
- wpt_tmp->SetCreationTime(rec->creation_time);
- }
- wpt_tmp->longitude = -DecodeOrd(rec->lon);
- wpt_tmp->latitude = DecodeOrd(rec->lat);
- wpt_tmp->notes = rec->comment;
- wpt_tmp->description = rec->name;
-
- if (rec->url) {
- wpt_tmp->AddUrlLink(rec->url);
- } else {
- int u = wpt_tmp->description.indexOf("{URL=");
- if (u != -1) {
- QString us = wpt_tmp->description.mid(u);
- us.remove(0,5); // throw away anything up to and including "{URL="
- us.chop(1); // throw away final character, assumed to be "}"
- if (!us.isEmpty()) {
- wpt_tmp->AddUrlLink(us);
- }
- }
- }
-
- if (rec->image_name) {
- wpt_tmp->icon_descr = rec->image_name;
- } else if (FindIconByGuid(&rec->guid, &icon)) {
- wpt_tmp->icon_descr = icon;
- }
-
- wpt_tmp->fs.FsChainAdd(rec);
- rec = nullptr;
- waypt_add(wpt_tmp);
- }
-}
-
-static void
-Write_One_AN1_Waypoint(const Waypoint* wpt)
-{
- an1_waypoint_record* rec;
-
- const auto* source_rec = reinterpret_cast<an1_waypoint_record*>(wpt->fs.FsChainFind(kFsAn1W));
-
- if (source_rec != nullptr) {
- rec = source_rec->clone();
- if (opt_zoom) {
- rec->visible_zoom = opt_zoom_num;
- }
- } else {
- rec = new an1_waypoint_record;
- rec->magic = 1;
- rec->type = wpt_type_num;
- rec->unk2 = 3;
- rec->unk3 = 18561;
- rec->radius = radius;
- rec->fillcolor = opt_color_num;
- rec->fillflags = 3;
- if (wpt_type_num == 5) {
- rec->fillflags = 0x8200;
- }
- rec->height = -50;
- rec->width = 20;
- rec->fontname = xstrdup("Arial");
- FindIconByName(opt_symbol, &rec->guid);
- rec->fontsize = 10;
- rec->visible_zoom = opt_zoom?opt_zoom_num:10;
- rec->unk6_1 = 1;
- }
- xfree(rec->name);
- rec->name = xstrdup(wpt->description);
-
- if (!nogc && wpt->gc_data->id) {
- // FIXME: this whole mess should be qstring concatenation
- auto* extra = (char*) xmalloc(25 + wpt->gc_data->placer.length() + wpt->shortname.length());
- sprintf(extra, "\r\nBy %s\r\n%s (%1.1f/%1.1f)",
- CSTR(wpt->gc_data->placer),
- CSTRc(wpt->shortname), wpt->gc_data->diff/10.0,
- wpt->gc_data->terr/10.0);
- rec->name = xstrappend(rec->name, extra);
- xfree(extra);
- }
-
- if (!nourl && wpt->HasUrlLink()) {
- UrlLink l = wpt->GetUrlLink();
- int len = 7 + l.url_.length();
- auto* extra = (char*)xmalloc(len);
- sprintf(extra, "{URL=%s}", CSTR(l.url_));
- rec->name = xstrappend(rec->name, extra);
- xfree(extra);
- if (rec->url) {
- xfree(rec->url);
- }
- rec->url = xstrdup(l.url_);
- }
- if (!wpt->notes.isEmpty()) {
- if (rec->comment) {
- xfree(rec->comment);
- }
- rec->comment = xstrdup(wpt->notes);
- }
-
-
- rec->creation_time = rec->modification_time = wpt->GetCreationTime().toTime_t();
- rec->lat = EncodeOrd(wpt->latitude);
- rec->lon = EncodeOrd(-wpt->longitude);
- rec->serial = serial++;
-
- if (rec->type == 0x12) { /* image */
- if (wpt->icon_descr.contains(":\\")) {
- rec->image_name = xstrdup(wpt->icon_descr);
- rec->height = -244;
- rec->width = -1;
- }
- }
- if (!rec->image_name && !wpt->icon_descr.isNull()) {
- FindIconByName(CSTR(wpt->icon_descr), &rec->guid);
- }
-
- Write_AN1_Waypoint(outfile, rec);
- delete rec;
-}
-
-static void Write_AN1_Waypoints(gbfile* f)
-{
- WriteShort(f, 2);
- WriteLong(f, waypt_count());
- waypt_disp_all(Write_One_AN1_Waypoint);
-}
-
-static void Read_AN1_Lines(gbfile* f)
-{
- ReadShort(f);
- unsigned long count = ReadLong(f);
- for (unsigned long i = 0; i < count; i++) {
- auto* rec = new an1_line_record;
- Read_AN1_Line(f, rec);
- /* create route rec */
- auto* rte_head = new route_head;
- rte_head->line_color.bbggrr = rec->linecolor;
- if (rec->opacity == 0x8200) {
- rte_head->line_color.opacity = 128;
- }
- // lineweight isn't set for dashed/dotted lines
- // Since we don't have a way to represent this internally yet,
- // use leave line_width at the default.
- if (rec->lineweight) {
- rte_head->line_width = rec->lineweight;
- }
- rte_head->rte_name = rec->name;
- rte_head->fs.FsChainAdd(rec);
- route_add_head(rte_head);
- for (unsigned long j = 0; j < (unsigned) rec->pointcount; j++) {
- auto* vert = new an1_vertex_record;
- Read_AN1_Vertex(f, vert);
-
- /* create route point */
- auto* wpt_tmp = new Waypoint;
- wpt_tmp->latitude = DecodeOrd(vert->lat);
- wpt_tmp->longitude = -DecodeOrd(vert->lon);
- wpt_tmp->shortname = QString::asprintf("\\%5.5lx", rtserial++);
- wpt_tmp->fs.FsChainAdd(vert);
- route_add_wpt(rte_head, wpt_tmp);
- }
- }
-}
-
-static void
-Make_Road_Changes(an1_line_record* rec)
-{
- int i = 0;
-
- if (!rec) {
- return;
- }
-
- if (!roadchanges) {
- return;
- }
-
- while (roadchanges[i].name) {
- if (!case_ignore_strcmp(roadchanges[i].name, rec->name)) {
- rec->roadtype = roadchanges[i].type;
- break;
- }
- i++;
- }
-}
-
-static void
-Write_One_AN1_Line(const route_head* rte)
-{
- an1_line_record* rec;
-
- const auto* source_rec = reinterpret_cast<an1_line_record*>(rte->fs.FsChainFind(kFsAn1L));
-
- if (source_rec != nullptr) {
- rec = source_rec->clone();
- switch (output_type_num) {
- case 1:
- if (rec->type != 14) {
- rec->roadtype = 0x11100541;
- rec->unk2 = 655360;
- rec->type = 14;
- rec->unk8 = 2;
- } // end if
- Make_Road_Changes(rec);
- break;
- case 2:
- if (rec->type != 15) {
- rec->type = 15;
- } // end if
- break;
- case 4:
- if (rec->type != 16) {
- rec->type = 16;
- } // end if
- break;
- }
- } else {
- rec = new an1_line_record;
- rec->name = nullptr;
- switch (output_type_num) {
- /* drawing road trail waypoint track */
- case 1: /* road */
- rec->roadtype = 0x11100541;
- rec->unk2 = 655360;
- rec->type = 14;
- rec->unk8 = 2;
- rec->name = xstrdup(rte->rte_name);
- break;
-
- case 2: /* trail */
- rec->roadtype = 0x11071c50;
- rec->unk2 = 917504;
- rec->type = 15;
- rec->unk8 = 2;
- break;
-
- case 4: /* track */
- rec->roadtype = 0x48800015;
- rec->unk2 = 917504;
- rec->type = 16;
- rec->unk4 = 2;
- rec->unk8 = 2;
- break;
-
- case 0: /* drawing */
- case 3: /* waypoint - shouldn't have lines */
- default:
- rec->roadtype = 0x48800015;
- rec->unk2 = 1048576;
- rec->type = 2;
- rec->unk4 = 2;
- rec->lineweight = 6;
- rec->linecolor = opt_color_num; /* red */
- rec->opacity = 3;
- rec->unk8 = 2;
- break;
- }
- if (!rec->name) {
- rec->name = xstrdup("");
- }
-
- }
- rec->serial = serial++;
- rec->pointcount = rte->rte_waypt_ct;
- Write_AN1_Line(outfile, rec);
- delete rec;
-}
-
-static void
-Write_One_AN1_Vertex(const Waypoint* wpt)
-{
- an1_vertex_record* rec;
-
- const auto* source_rec = reinterpret_cast<an1_vertex_record*>(wpt->fs.FsChainFind(kFsAn1V));
-
- if (source_rec != nullptr) {
- rec = source_rec->clone();
- } else {
- rec = new an1_vertex_record;
- rec->magic = 1;
- }
- rec->lat = EncodeOrd(wpt->latitude);
- rec->lon = EncodeOrd(-wpt->longitude);
-
- Write_AN1_Vertex(outfile, rec);
- delete rec;
-}
-
-static void Write_AN1_Lines(gbfile* f)
-{
- WriteShort(f, 2);
- WriteLong(f, route_count()+track_count());
-
- route_disp_all(Write_One_AN1_Line, nullptr, Write_One_AN1_Vertex);
- track_disp_all(Write_One_AN1_Line, nullptr, Write_One_AN1_Vertex);
-}
-
-static void
-Init_Wpt_Type()
-{
- if (!opt_wpt_type || !opt_wpt_type[0]) {
- wpt_type_num = 1; /* marker */
- return;
- }
- if ((opt_wpt_type[0] & 0xf0) == 0x30) {
- wpt_type_num = atoi(opt_wpt_type);
- } else {
- wpt_type_num = 1; /* marker */
- if (!case_ignore_strcmp(opt_wpt_type, "marker")) {
- wpt_type_num = 1;
- } else if (!case_ignore_strcmp(opt_wpt_type, "symbol")) {
- wpt_type_num = 1; /* symbol and marker are synonyms */
- } else if (!case_ignore_strcmp(opt_wpt_type, "text")) {
- wpt_type_num = 4;
- } else if (!case_ignore_strcmp(opt_wpt_type, "mapnote")) {
- wpt_type_num = 6;
- } else if (!case_ignore_strcmp(opt_wpt_type, "circle")) {
- wpt_type_num = 5;
- } else if (!case_ignore_strcmp(opt_wpt_type, "image")) {
- wpt_type_num = 18;
- } else {
- fatal(MYNAME ": wpt_type must be "
- "symbol, text, mapnote, circle, or image\n");
- }
- }
-}
-
-static void
-Init_Output_Type()
-{
- if (!output_type || !output_type[0]) {
- output_type_num = last_read_type;
- return;
- }
- if ((output_type[0] & 0xf0) == 0x30) {
- output_type_num = atoi(output_type);
- } else {
- output_type_num = 0;
- if (!case_ignore_strcmp(output_type, "drawing")) {
- output_type_num = 0;
- } else if (!case_ignore_strcmp(output_type, "road")) {
- output_type_num = 1;
- } else if (!case_ignore_strcmp(output_type, "trail")) {
- output_type_num = 2;
- } else if (!case_ignore_strcmp(output_type, "waypoint")) {
- output_type_num = 3;
- } else if (!case_ignore_strcmp(output_type, "track")) {
- output_type_num = 4;
- } else {
- fatal(MYNAME ": type must be "
- "drawing, road, trail, waypoint, or track\n");
- }
- }
- last_read_type = output_type_num;
-}
-
-static long
-Parse_Change_Type(char* type)
-{
- long retval = 0x11100541;
-
- if (!case_ignore_strcmp(type, "limited")) {
- retval = 0x11070430;
- } else if (!case_ignore_strcmp(type, "toll")) {
- retval = 0x11070470;
- } else if (!case_ignore_strcmp(type, "us")) {
- retval = 0x11070870;
- } else if (!case_ignore_strcmp(type, "state")) {
- retval = 0x11070c10;
- } else if (!case_ignore_strcmp(type, "primary")) {
- /* primary state/provincial routes */
- retval = 0x11070840;
- } else if (!case_ignore_strcmp(type, "major")) {
- retval = 0x11070c30;
- } else if (!case_ignore_strcmp(type, "local")) {
- retval = 0x11071010;
- } else if (!case_ignore_strcmp(type, "ramp")) {
- retval = 0x11070cb0;
- } else if (!case_ignore_strcmp(type, "ferry")) {
- retval = 0x11070ca0;
- } else if (!case_ignore_strcmp(type, "editable")) {
- retval = 0x11100541;
- } else {
- fatal(MYNAME ": unknown road type for road changes\n");
- }
- return retval;
-}
-
-static void
-Free_Road_Changes()
-{
- int i = 0;
- if (roadchanges) {
- while (roadchanges[i].name) {
- xfree(roadchanges[i].name);
- i++;
- }
- xfree(roadchanges);
- }
- roadchanges = nullptr;
-}
-
-static void
-Init_Road_Changes()
-{
- int count = 0;
- Free_Road_Changes();
-
- if (!road_changes || !road_changes[0]) {
- return;
- }
- char* bar = strchr(road_changes, '!');
- while (bar) {
- count++;
- bar = strchr(bar+1, '!');
- }
- if (!(count&1)) {
- fatal(MYNAME ": invalid format for road changes\n");
- }
- count = 1 + count / 2;
- roadchanges = (roadchange*)xmalloc((count+1) * sizeof(roadchange));
-
- roadchanges[count].type = 0;
- roadchanges[count].name = nullptr;
-
- char* copy = xstrdup(road_changes);
- bar = copy;
-
- while (count) {
- count--;
- char* name = bar;
- bar = strchr(name, '!');
- *bar = '\0';
- bar++;
- char* strType = bar;
- bar = strchr(strType, '!');
- if (bar) {
- *bar = '\0';
- bar++;
- }
- roadchanges[count].name = xstrdup(name);
- roadchanges[count].type = Parse_Change_Type(strType);
- }
-
- xfree(copy);
-}
-
-static void
-rd_init(const QString& fname)
-{
- infile = gbfopen_le(fname, "rb", MYNAME);
-}
-
-static void
-rd_deinit()
-{
- gbfclose(infile);
-}
-
-static void
-my_read()
-{
- Read_AN1_Header(infile);
- Read_AN1_Bitmaps(infile);
- Read_AN1_Waypoints(infile);
- Read_AN1_Lines(infile);
-}
-
-static void
-wr_init(const QString& fname)
-{
- outfile = gbfopen_le(fname, "wb", MYNAME);
- Init_Output_Type();
- Init_Road_Changes();
- opt_color_num = color_to_bbggrr(opt_color);
- Init_Wpt_Type();
- if (opt_zoom) {
- opt_zoom_num = atoi(opt_zoom);
- }
- radius = .1609344; /* 1/10 mi in kilometers */
- if (opt_radius) {
- radius = atof(opt_radius);
- if (!strchr(opt_radius,'k') && !strchr(opt_radius,'K')) {
- radius *= kKilometersPerMile;
- }
- }
-}
-
-static void
-wr_deinit()
-{
- Free_Road_Changes();
- gbfclose(outfile);
-}
-
-static void
-my_write()
-{
- Write_AN1_Header(outfile);
- Write_AN1_Bitmaps(outfile);
- Write_AN1_Waypoints(outfile);
- Write_AN1_Lines(outfile);
-}
-
-ff_vecs_t an1_vecs = {
- ff_type_file,
- {
- (ff_cap)(ff_cap_read | ff_cap_write) /* waypoints */,
- ff_cap_write /* tracks */,
- (ff_cap)(ff_cap_read | ff_cap_write) /* routes */,
- },
- rd_init,
- wr_init,
- rd_deinit,
- wr_deinit,
- my_read,
- my_write,
- nullptr,
- &an1_args,
- CET_CHARSET_ASCII, 0 /* CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-/*
-
-
-
-
-
-
-
-
-
- THIS FILE IS AUTOMATICALLY GENERATED
-
-
- Please change make-an1sym.pl and
- regenerate it rather than changing
- this file directly.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-*/
-
-/*
- Read DeLorme drawing files (.an1) - supplemental (included by an1.c)
-
- Copyright (C) 2005 Ron Parker and Robert Lipe.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-static struct defguid {
- guid_t guid;
- const char* name;
-} default_guids[] = {
- { {0xb610bc70,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Hiker"
- },
- { {0xb610bc71,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Canoe"
- },
- { {0xb610bc72,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Kayak"
- },
- { {0xb610bc73,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Bike"
- },
- { {0xb610bc74,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Four wheeler"
- },
- { {0xb610bc75,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Jeep"
- },
- { {0xb610bc76,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Snowmobile"
- },
- { {0xb610bc78,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Rec Vehicle"
- },
- { {0xb610bc79,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Fire"
- },
- { {0xb610bc7a,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Fishing"
- },
- { {0xb610bc7b,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Tree"
- },
- { {0xb610bc7c,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Pine Tree"
- },
- { {0xb610bc7d,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Birch"
- },
- { {0xb610bc7e,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Deer"
- },
- { {0xb610bc7f,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Moose"
- },
- { {0x99d8c163,{0x7622, 0x11d5, 0xe8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Mud"
- },
- { {0x012dfac2,{0xade8, 0x11d5, 0x0fb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Tractor"
- },
- { {0x012dfac3,{0xade8, 0x11d5, 0x0fb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Combine Harvester"
- },
- { {0x012dfac7,{0xade8, 0x11d5, 0x0fb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Front-End Loader"
- },
- { {0xfd163780,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Power Shovel"
- },
- { {0xfd163781,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Road Grader"
- },
- { {0xfd163784,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Road Roller"
- },
- { {0xfd163787,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Dump Truck"
- },
- { {0x5673d712,{0xb28d, 0x11d5, 0x13b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Skid-Steer Loader"
- },
- { {0xb86045ac,{0x390f, 0x420f, 0x91a7}, {0x76, 0x2f, 0x48, 0xea, 0xe2, 0xd7}},
- "Highway Sign"
- },
- { {0x1e129e95,{0x13b6, 0x48d8, 0x3fa3}, {0x9c, 0xc8, 0x20, 0x8e, 0x1d, 0x9d}},
- "Orange Cone"
- },
- { {0xadee7d54,{0xf7c9, 0x4ab6, 0xfb93}, {0x99, 0xc3, 0xbc, 0x9d, 0x15, 0x47}},
- "Barricade"
- },
- { {0xa170000f,{0x8bd8, 0x4574, 0x58ac}, {0x55, 0x41, 0x67, 0xef, 0x64, 0x62}},
- "Flagger"
- },
- { {0xa425f90e,{0x6ab6, 0x4ca9, 0x8997}, {0xbf, 0xca, 0xe0, 0xc2, 0x2b, 0x53}},
- "Construction Sign"
- },
- { {0x0805b240,{0x6b26, 0x4300, 0xebb1}, {0xea, 0x9b, 0xcf, 0x68, 0xc6, 0x18}},
- "Construction Flasher"
- },
- { {0x56721a6c,{0x8e77, 0x4b62, 0x09aa}, {0xce, 0xdc, 0x69, 0x4a, 0x16, 0x05}},
- "Transit"
- },
- { {0x623e1ee9,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Arrow Left"
- },
- { {0x623e1eea,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Arrow Right"
- },
- { {0x623e1eeb,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Arrow Up"
- },
- { {0x623e1eec,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Arrow Down"
- },
- { {0x623e1eed,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Arrow Up Left"
- },
- { {0x623e1eee,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Arrow Up Right"
- },
- { {0x623e1eef,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Arrow Down Left"
- },
- { {0x623e1ef0,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Arrow Down Right"
- },
- { {0x83f91421,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Arrow Left"
- },
- { {0x83f91422,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Arrow Right"
- },
- { {0x83f91423,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Arrow Up"
- },
- { {0x83f91424,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Arrow Down"
- },
- { {0x83f91425,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Arrow Up Left"
- },
- { {0x83f91426,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Arrow Up Right"
- },
- { {0x83f91427,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Arrow Down Left"
- },
- { {0x83f91428,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Arrow Down Right"
- },
- { {0x83f91429,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Large Arrow Left"
- },
- { {0x83f9142a,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Large Arrow Right"
- },
- { {0x83f9142b,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Large Arrow Up"
- },
- { {0x83f9142c,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Large Arrow Down"
- },
- { {0x83f9142d,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Large Arrow Down Right"
- },
- { {0x83f9142e,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Large Arrow Down Left"
- },
- { {0x83f9142f,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Large Arrow Up Left"
- },
- { {0x83f91430,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Large Arrow Up Right"
- },
- { {0x8ff0aad1,{0xc53d, 0x4998, 0x7ebd}, {0x06, 0x60, 0x25, 0x6c, 0x4f, 0x6d}},
- "Accommodation"
- },
- { {0xaf7bf199,{0x6a8b, 0x49fe, 0xae92}, {0xa3, 0x09, 0x7b, 0xb8, 0x81, 0x6a}},
- "Australia"
- },
- { {0x6bbcc9d1,{0x6a19, 0x4c7b, 0xc6a2}, {0x3e, 0x17, 0x02, 0xd6, 0xee, 0x3a}},
- "Blue Dome Cross"
- },
- { {0xfff920fe,{0xd780, 0x49d4, 0x1bad}, {0x55, 0x2e, 0xc7, 0xdf, 0xa2, 0xaa}},
- "Green Dome Cross"
- },
- { {0x57e75924,{0xd6fa, 0x4666, 0x84bf}, {0x5b, 0x76, 0xa1, 0xd0, 0x14, 0x5f}},
- "Business"
- },
- { {0xb09ef4a7,{0x95e4, 0x4e5e, 0x5e84}, {0xbe, 0x2b, 0x86, 0xdd, 0x50, 0x65}},
- "Airplane"
- },
- { {0xf2833c22,{0x3592, 0x4a8a, 0x5693}, {0xee, 0x6c, 0x83, 0xb6, 0x3c, 0x19}},
- "Amusement Recreation"
- },
- { {0x6f0317d6,{0x7fa3, 0x4dcc, 0x6187}, {0x7e, 0xca, 0xcb, 0x65, 0x49, 0x12}},
- "Green Square"
- },
- { {0x18a6d3c0,{0x45cb, 0x4d19, 0xf5b9}, {0xc7, 0x9c, 0xbf, 0x8f, 0x6d, 0x46}},
- "Red Triangle"
- },
- { {0x86e68ea7,{0xb9ab, 0x4bc8, 0xa1bf}, {0xc1, 0x22, 0x13, 0x97, 0x95, 0xe8}},
- "Red Triangle and Green Square"
- },
- { {0x6afd74bf,{0x0ea5, 0x4680, 0xcd88}, {0x15, 0x87, 0x2f, 0x6c, 0xd2, 0xd8}},
- "City 4"
- },
- { {0x49dfeb74,{0xbb09, 0x4df1, 0x5687}, {0xd8, 0xa0, 0xff, 0x36, 0x89, 0x3d}},
- "White Square"
- },
- { {0x3eed62c6,{0xdab9, 0x42b0, 0xe4a3}, {0xd2, 0xf1, 0x7d, 0x54, 0xbf, 0x77}},
- "White Triangle"
- },
- { {0x6b521940,{0x4492, 0x4c48, 0x58a0}, {0xfc, 0xd1, 0x1f, 0x5e, 0x0c, 0xea}},
- "Red Black Diamond Flag"
- },
- { {0xbb8ebaa3,{0xac59, 0x4411, 0x9c94}, {0x30, 0xd4, 0xe1, 0x21, 0x25, 0x46}},
- "Yellow Diamond Flag"
- },
- { {0x8e118862,{0xf6aa, 0x4b34, 0x2b82}, {0x8f, 0x3b, 0x5a, 0x2b, 0x59, 0xeb}},
- "Small Pink Square"
- },
- { {0xd0ef64c2,{0xe319, 0x4876, 0x1b85}, {0x0e, 0x90, 0x50, 0x89, 0xb7, 0xc5}},
- "Store"
- },
- { {0xa22b08fb,{0x6193, 0x4f5c, 0xdaa4}, {0xfa, 0xdf, 0xa7, 0x6e, 0x23, 0xe1}},
- "Camping"
- },
- { {0x27f57c69,{0x575b, 0x4b56, 0x288c}, {0xe8, 0xe1, 0xc7, 0x05, 0x1f, 0x1f}},
- "Green Diamond Flag"
- },
- { {0xe07abb38,{0x219f, 0x4b52, 0x868b}, {0x45, 0x0f, 0xbc, 0xc1, 0x4f, 0x6a}},
- "Red Diamond Flag"
- },
- { {0x3a124ac9,{0x3973, 0x4e27, 0x4b82}, {0xa6, 0x3a, 0x94, 0x5c, 0xf8, 0xb3}},
- "Red Green Diamond Flag"
- },
- { {0x64ed669b,{0x0db8, 0x4ec9, 0xd181}, {0x98, 0x50, 0xb3, 0x8b, 0x2f, 0x2e}},
- "White Globe"
- },
- { {0x3cb10adc,{0xb090, 0x4960, 0x9f8a}, {0xec, 0xaf, 0x6c, 0xd7, 0xaa, 0x8b}},
- "Yellow Globe"
- },
- { {0x2779347d,{0x17d4, 0x4021, 0xa6a8}, {0x51, 0x9a, 0xb6, 0xf8, 0x21, 0xff}},
- ""
- },
- { {0x3ad63f7b,{0x4339, 0x427d, 0x5797}, {0xce, 0xa9, 0x96, 0x33, 0x8b, 0x3c}},
- "Black Cross"
- },
- { {0x3e89481e,{0x35ff, 0x48b6, 0xc7ae}, {0xb0, 0x75, 0xf6, 0x43, 0xc4, 0xc7}},
- "Church"
- },
- { {0x68622c10,{0x79b6, 0x466d, 0xa8a3}, {0x27, 0xc6, 0x25, 0x34, 0xfa, 0xa9}},
- "Small Dark Green Square"
- },
- { {0x42c6a873,{0x2d0c, 0x46e7, 0x9989}, {0xdd, 0x86, 0x01, 0x6e, 0xa4, 0xc9}},
- "Small Black Square"
- },
- { {0x50e3b06e,{0xbe81, 0x4b2c, 0x1f92}, {0x80, 0xa5, 0x72, 0x9b, 0x33, 0x05}},
- "Danger"
- },
- { {0x369d0b22,{0xed07, 0x421f, 0x8780}, {0x33, 0x0e, 0xbd, 0x27, 0x4f, 0x3c}},
- "Construction Business"
- },
- { {0x10603b6c,{0xb02e, 0x49ee, 0x60b9}, {0xed, 0x7e, 0x31, 0x16, 0x27, 0x89}},
- "Airport"
- },
- { {0x8328aab7,{0xfe04, 0x46dc, 0x7bbf}, {0x29, 0x34, 0x30, 0xd3, 0x4d, 0xeb}},
- "City 5"
- },
- { {0x96411287,{0xda33, 0x40e3, 0xaa9c}, {0x75, 0x83, 0x78, 0x2d, 0xa6, 0xf3}},
- "USA"
- },
- { {0xb2f98627,{0x1211, 0x40e8, 0xb287}, {0x6d, 0x66, 0xfd, 0x15, 0x1e, 0xd4}},
- "Diver Down"
- },
- { {0x3fce26d0,{0xfec6, 0x4f8b, 0x55a2}, {0x89, 0x3a, 0x8e, 0x59, 0x08, 0x0a}},
- "Light Yellow Square"
- },
- { {0xb4b68597,{0x1aed, 0x4918, 0xd492}, {0x1f, 0xd1, 0x5e, 0xf2, 0x55, 0xc1}},
- "Education Technology"
- },
- { {0x35d2e6a8,{0xda88, 0x4edb, 0x4b80}, {0x2b, 0x1b, 0xcf, 0xc0, 0xd4, 0x6d}},
- "Computer"
- },
- { {0x4ddc4e96,{0x8d19, 0x4079, 0x4488}, {0xc0, 0x8f, 0x0f, 0x8e, 0xb5, 0xd7}},
- "Amusement Recreation Red"
- },
- { {0x79f58929,{0x46c6, 0x4337, 0xc0b1}, {0xf0, 0x09, 0x55, 0xbb, 0x1f, 0xc3}},
- "Telephone Red"
- },
- { {0x0083b377,{0xfb80, 0x4a83, 0x3593}, {0x56, 0xe5, 0xfe, 0xc4, 0xcd, 0x43}},
- "Exit"
- },
- { {0x0c232891,{0xab4d, 0x440e, 0x7083}, {0x05, 0x63, 0x3a, 0xf5, 0x66, 0x11}},
- "Exit with Services"
- },
- { {0xaf63e7c2,{0x03fa, 0x418e, 0xc68b}, {0x02, 0xb8, 0xf5, 0x61, 0xb6, 0x61}},
- "Pizza"
- },
- { {0xd419c693,{0x39e6, 0x43db, 0xa1b8}, {0x7f, 0xcc, 0x2c, 0xb8, 0x51, 0x4a}},
- "Financial Services"
- },
- { {0x70740a81,{0xe4ca, 0x4ac2, 0xa498}, {0x21, 0xc8, 0x5b, 0xc0, 0xb7, 0xae}},
- "City 3"
- },
- { {0x9a582ff6,{0x34c4, 0x41c6, 0xf0a3}, {0x99, 0x69, 0x9d, 0xbe, 0x2e, 0x08}},
- "Food Store"
- },
- { {0x3cd31689,{0x2f8f, 0x4fb0, 0xcb88}, {0x34, 0x84, 0xfc, 0x8b, 0x03, 0xe4}},
- ""
- },
- { {0x952557a6,{0xe29e, 0x4512, 0x1184}, {0x1a, 0x3c, 0x9c, 0xd4, 0x83, 0x7d}},
- ""
- },
- { {0x03dc278c,{0xe8ff, 0x46ac, 0x3daa}, {0x9f, 0xe9, 0x1e, 0xcf, 0x10, 0x35}},
- "Driving Range"
- },
- { {0xacd28bab,{0x0ec0, 0x4393, 0xaf8b}, {0xbb, 0x5e, 0x74, 0xb3, 0x87, 0x12}},
- "Golf Municipal"
- },
- { {0x984e7139,{0xeab8, 0x49f6, 0x55a0}, {0x8d, 0x51, 0xe6, 0xdd, 0xcc, 0xf4}},
- "Golf Private"
- },
- { {0xec5828ab,{0x2a9d, 0x48f8, 0xd79b}, {0xc9, 0xc3, 0x30, 0x8e, 0xe4, 0xea}},
- "Golf Public"
- },
- { {0xb0120d99,{0x683a, 0x4ecc, 0x129a}, {0x29, 0x94, 0x1f, 0x04, 0xae, 0x10}},
- "Golf Resort"
- },
- { {0x2ce7685a,{0x6eaf, 0x4061, 0x29a5}, {0x87, 0x5e, 0xfa, 0x41, 0x75, 0x1a}},
- "Golf Semi Private"
- },
- { {0x10397049,{0x9fc9, 0x4380, 0x5680}, {0x81, 0xd9, 0xe7, 0x43, 0x1f, 0x11}},
- "Medical Service"
- },
- { {0x2fc28df6,{0xe806, 0x436e, 0xe0b9}, {0x46, 0x1d, 0xeb, 0xad, 0x56, 0x60}},
- "Home Furnishings"
- },
- { {0x910313db,{0xafce, 0x4019, 0x1aa4}, {0xe6, 0x2c, 0xe6, 0xd1, 0xfd, 0xf7}},
- "Industrial"
- },
- { {0x9e442c6e,{0xe12a, 0x4407, 0xd68a}, {0x1c, 0x5e, 0x19, 0xe7, 0xfe, 0x01}},
- ""
- },
- { {0x37e2fe4a,{0xcd71, 0x413f, 0x0cad}, {0x81, 0xc5, 0x2c, 0xf4, 0x78, 0x79}},
- ""
- },
- { {0x3c756e09,{0xb2dc, 0x48a6, 0x04a9}, {0x20, 0xb7, 0xc9, 0x9d, 0x14, 0x51}},
- ""
- },
- { {0xa1245b1c,{0x156a, 0x48fc, 0x6f96}, {0xa5, 0xa3, 0x22, 0x54, 0x13, 0x97}},
- "Manufacturing"
- },
- { {0x5bddbd7a,{0xf3cb, 0x454c, 0x06af}, {0x46, 0x1a, 0x68, 0xea, 0x60, 0x1a}},
- "Note"
- },
- { {0xcb6777e1,{0xe0e0, 0x45ce, 0x309f}, {0x8d, 0x61, 0x7a, 0xd9, 0x89, 0xf5}},
- "City"
- },
- { {0xbc168c08,{0x2b7f, 0x44be, 0x3883}, {0x81, 0x31, 0x4a, 0x09, 0xf5, 0x78}},
- "Air Base"
- },
- { {0xa8857b0f,{0xfc3b, 0x4cd1, 0x9e91}, {0xf5, 0x3b, 0x21, 0xa8, 0x3b, 0xb9}},
- "Battlefield"
- },
- { {0x06db55c1,{0xf687, 0x4840, 0x7c80}, {0x95, 0x58, 0x77, 0x8e, 0x5a, 0xdd}},
- "Mining"
- },
- { {0xcc61b277,{0xa48c, 0x445a, 0xd9b9}, {0xe5, 0x91, 0x36, 0x18, 0x4e, 0x09}},
- "Mountain"
- },
- { {0xfde13186,{0xb6cb, 0x4374, 0xc880}, {0x56, 0x99, 0xeb, 0x51, 0x68, 0x87}},
- "Capital"
- },
- { {0xb14d90d1,{0xd943, 0x40ff, 0x9fb7}, {0x9b, 0x92, 0xd1, 0x23, 0xca, 0xef}},
- "Route"
- },
- { {0x7eabc63f,{0x05d0, 0x4465, 0xb1b0}, {0x61, 0x2a, 0xf7, 0x4d, 0x0f, 0x4e}},
- "Overnight"
- },
- { {0xac39d8b9,{0xfcdc, 0x4b50, 0x9ca6}, {0xea, 0x6c, 0x4b, 0xb5, 0x96, 0x0f}},
- "Route End Active"
- },
- { {0xe1b9d86b,{0x95e6, 0x4bd8, 0xd880}, {0x7b, 0x6c, 0xc6, 0xd2, 0x00, 0x34}},
- "Route End Inactive"
- },
- { {0x98712315,{0x7e1e, 0x4024, 0x8392}, {0xe3, 0xb8, 0x5a, 0x51, 0x45, 0xb4}},
- "Fuel Stop"
- },
- { {0xe5ea5b38,{0x7b80, 0x4b42, 0x0aba}, {0x3d, 0x38, 0xf0, 0xe1, 0x17, 0x9a}},
- "Route Start Active"
- },
- { {0x18fd0d49,{0x0a29, 0x433a, 0xd584}, {0xe5, 0xb7, 0x5b, 0xe8, 0x25, 0xbc}},
- "Route Start Inactive"
- },
- { {0x2f52144b,{0x903e, 0x4dd9, 0x79af}, {0xe1, 0x66, 0x9b, 0xfc, 0xa9, 0xc1}},
- "Route Stop Active"
- },
- { {0xfaf8d826,{0xd27d, 0x4316, 0x0e92}, {0xce, 0x8d, 0x85, 0x93, 0x4c, 0xf5}},
- "Route Stop Inactive"
- },
- { {0xff44cae2,{0x707c, 0x4a1c, 0x43af}, {0x8b, 0xb6, 0xb1, 0x19, 0x9c, 0xf2}},
- "Route Via"
- },
- { {0x5a50d59b,{0xc15b, 0x49c4, 0x9faa}, {0xc4, 0x1c, 0x4f, 0xe2, 0x95, 0x2a}},
- "Radiation Green"
- },
- { {0x19556023,{0xb1e5, 0x4c9c, 0x49ba}, {0x08, 0x52, 0xa1, 0x24, 0x3d, 0x9f}},
- "Radiation Red"
- },
- { {0xa54be251,{0x6688, 0x49fb, 0x60b3}, {0x89, 0x56, 0x37, 0x68, 0xc5, 0xb0}},
- "Electricity"
- },
- { {0xd793ff0c,{0xfbe0, 0x4383, 0x3183}, {0xcf, 0x4f, 0x04, 0xb7, 0xee, 0x0a}},
- "Personal Furnishings"
- },
- { {0x00f90733,{0x7ab5, 0x42cf, 0x468c}, {0xbf, 0x91, 0x27, 0xd3, 0xa8, 0x9c}},
- "Personal Services"
- },
- { {0xea677f24,{0xbbe8, 0x4238, 0xee9c}, {0x6c, 0x0a, 0xec, 0x0e, 0x34, 0xf4}},
- "Telephone Black"
- },
- { {0x2d8a05b5,{0x8baf, 0x4f28, 0xf58b}, {0xfb, 0x7f, 0x37, 0x34, 0x28, 0xa7}},
- "Government Light"
- },
- { {0x40c64dfc,{0xc2d0, 0x4b0e, 0x6582}, {0x3f, 0x26, 0x9c, 0xcb, 0x6f, 0x1d}},
- "Airport Red Square"
- },
- { {0xf27adb5d,{0x3629, 0x44c7, 0x95a2}, {0x25, 0x2c, 0x95, 0x24, 0x98, 0x2f}},
- "Propeller Aircraft"
- },
- { {0x5a718e13,{0x3547, 0x42c5, 0x6d9d}, {0xb2, 0x82, 0xa5, 0x53, 0xbd, 0x3a}},
- "Jet Aircraft"
- },
- { {0x0a471039,{0x2dfe, 0x447e, 0x54be}, {0xa3, 0x93, 0xae, 0x9a, 0xdd, 0xac}},
- "Government"
- },
- { {0x4a59da2f,{0xe1c3, 0x42c3, 0x6ca1}, {0x06, 0xb9, 0x14, 0x1b, 0x89, 0x99}},
- "USA Regional"
- },
- { {0xf16500a9,{0xa845, 0x4293, 0xae89}, {0x5c, 0x29, 0xbb, 0x0d, 0x06, 0xf7}},
- "House 2"
- },
- { {0x7b05524d,{0xcb5a, 0x456f, 0x96b3}, {0x03, 0x61, 0x24, 0x54, 0x6a, 0x54}},
- "Picnic"
- },
- { {0xb88ad7a1,{0xb94d, 0x42e8, 0x2b9d}, {0xf5, 0x4c, 0x2b, 0xff, 0x57, 0xdc}},
- "Restaurant"
- },
- { {0xdc48a20a,{0x54a2, 0x4c61, 0x1fbe}, {0x02, 0x74, 0x5b, 0xe9, 0x18, 0x99}},
- "Store 2"
- },
- { {0x6b5ab040,{0x96df, 0x46ae, 0xacb8}, {0xe4, 0x47, 0x66, 0x3f, 0xec, 0x9b}},
- ""
- },
- { {0x153b2cff,{0x6232, 0x4294, 0xd59a}, {0xc5, 0xa0, 0x7b, 0xe0, 0x16, 0xeb}},
- "Blue Star"
- },
- { {0xf276f6b3,{0x586a, 0x4bf8, 0x2f82}, {0xf2, 0x69, 0xe3, 0x76, 0x7e, 0xd5}},
- ""
- },
- { {0x91d242c8,{0x0986, 0x4fad, 0x8286}, {0xec, 0x79, 0x79, 0xcd, 0xab, 0x02}},
- "Running"
- },
- { {0x8b0078db,{0x6ee0, 0x4caa, 0xd3b5}, {0xfe, 0xe1, 0xc2, 0xbf, 0x94, 0x7d}},
- "Transportation"
- },
- { {0x0599f6c9,{0x478e, 0x4f63, 0x78a5}, {0xed, 0x31, 0xb5, 0xae, 0xda, 0x89}},
- "Fishing 2"
- },
- { {0x7389128c,{0x0e78, 0x4d5d, 0x4189}, {0xb8, 0xf3, 0xb5, 0xbd, 0x70, 0xb1}},
- "Automotive"
- },
- { {0x0362b593,{0x3df6, 0x48ed, 0xc489}, {0x85, 0x13, 0xc1, 0xc0, 0xb9, 0x0d}},
- "Cloudy"
- },
- { {0xf0717a94,{0xd048, 0x4770, 0x9bab}, {0x80, 0x09, 0xbd, 0x4b, 0x1e, 0x75}},
- "Partly Cloudy"
- },
- { {0x14486bbc,{0xae6b, 0x44ea, 0xd6b9}, {0xbf, 0x9a, 0x39, 0x7a, 0x51, 0x6c}},
- "Mostly Cloudy"
- },
- { {0x7a258c70,{0xabec, 0x4cff, 0x4983}, {0x84, 0xdc, 0x2f, 0x2e, 0xff, 0x28}},
- "Hurricane"
- },
- { {0xeff260d4,{0x46d5, 0x4fb5, 0xc79c}, {0x5e, 0x06, 0xc8, 0xab, 0x7a, 0x2b}},
- "Lightning"
- },
- { {0xc3d70220,{0x5154, 0x4766, 0xf0af}, {0xdf, 0x86, 0x74, 0x40, 0x5f, 0x8c}},
- "Rain"
- },
- { {0xf2dfbc91,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Blue Flag"
- },
- { {0xf2dfbc92,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Dark Blue Flag"
- },
- { {0xf2dfbc93,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Brown Flag"
- },
- { {0xf2dfbc94,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Yellow Flag"
- },
- { {0xf2dfbc95,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Red Flag 2"
- },
- { {0xf2dfbc96,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Dark Red Flag"
- },
- { {0xf2dfbc97,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Dark Green Flag"
- },
- { {0xf2dfbc98,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Green Flag"
- },
- { {0xf2dfbc99,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Blue-Green Flag"
- },
- { {0xf2dfbc9a,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Light Blue Flag"
- },
- { {0x623e1ee1,{0xaf27, 0x100f, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Dark Blue Map Pin"
- },
- { {0xf2dfbc9d,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Blue Map Pin"
- },
- { {0xf2dfbc9e,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Yellow Map Pin"
- },
- { {0xf2dfbc9f,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Brown Map Pin"
- },
- { {0xf2dfbca0,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Red Map Pin"
- },
- { {0xf2dfbca1,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Dark Red Map Pin"
- },
- { {0xf2dfbca2,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Green Map Pin"
- },
- { {0xf2dfbca3,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Dark Green Map Pin"
- },
- { {0xf2dfbca4,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Gray Map Pin"
- },
- { {0xf2dfbca5,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Dark Gray Map Pin"
- },
- { {0xd1703de0,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Green Dot"
- },
- { {0xd1703de1,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Dark Green Dot"
- },
- { {0xd1703de2,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Blue Dot"
- },
- { {0xd1703de3,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Dark Blue Dot"
- },
- { {0xd1703de5,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Red Dot"
- },
- { {0x45c088e0,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Dark Red Dot"
- },
- { {0x45c088e1,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Yellow Dot"
- },
- { {0x45c088e2,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Brown Dot"
- },
- { {0x45c088e3,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Light Blue Dot"
- },
- { {0xbde3a8a1,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Blue-Green Dot"
- },
- { {0xbde3a8a2,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Green Dot"
- },
- { {0xbde3a8a3,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Dark Green Dot"
- },
- { {0xbde3a8a4,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Blue Dot"
- },
- { {0xbde3a8a5,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Dark Blue Dot"
- },
- { {0xbde3a8a6,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Red Dot"
- },
- { {0xbde3a8a7,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Dark Red Dot"
- },
- { {0xbde3a8a8,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Yellow Dot"
- },
- { {0xbde3a8a9,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Brown Dot"
- },
- { {0xbde3a8aa,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Light Blue Dot"
- },
- { {0xbde3a8ab,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
- "Small Blue-Green Dot"
- },
- { {0x623e1ee0,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Red Flag"
- },
- { {0x623e1ee1,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Map Pin"
- },
- { {0x623e1ee2,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Yellow Square"
- },
- { {0x623e1ee3,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Red X"
- },
- { {0x623e1ee4,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Blue Circle"
- },
- { {0x623e1ee5,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "House"
- },
- { {0x623e1ee7,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Triangle"
- },
- { {0x623e1ee8,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
- "Green Star"
- },
- { {0x9d277805,{0xe2f8, 0x4f43, 0x3f97}, {0x35, 0x0d, 0x40, 0xae, 0x5c, 0xd3}},
- "Geocache"
- },
- { {0xcb8aad04,{0xcc2d, 0x47f2, 0x428a}, {0x80, 0xf7, 0xd6, 0x68, 0xed, 0x32}},
- "Geocache Found"
- },
- { {0x7341c1f4,{0xdecd, 0x4d35, 0x45a5}, {0x52, 0x25, 0x5e, 0xbf, 0xe6, 0x51}},
- "Tent"
- },
- { {0x835b84e2,{0xf10c, 0x45cb, 0x958f}, {0x18, 0x3a, 0xc2, 0x2a, 0xe5, 0x28}},
- "Tipup Up"
- },
- { {0xce06fc92,{0xbb0c, 0x4ec1, 0xda93}, {0x64, 0x4a, 0x60, 0xbe, 0x40, 0x90}},
- "Topup Down"
- },
-};
-
-static int FindIconByName(const char* name, guid_t* guid)
-{
- for (unsigned int i = 0; i < (sizeof(default_guids)/sizeof(struct defguid)); ++i) {
- if (!case_ignore_strcmp(name, default_guids[i].name)) {
- *guid = default_guids[i].guid;
- return 1;
- }
- }
- return 0;
-}
-
-static int FindIconByGuid(const guid_t* guid, const char** name)
-{
- for (unsigned int i = 0; i < (sizeof(default_guids)/sizeof(struct defguid)); ++i) {
- /* don't compare any structure padding */
- if ((guid->l == default_guids[i].guid.l) &&
- memcmp(guid->s, default_guids[i].guid.s, sizeof(guid->s)) &&
- memcmp(guid->c, default_guids[i].guid.c, sizeof(guid->c))) {
- *name = default_guids[i].name;
- return 1;
- }
- }
- return 0;
-}
--- /dev/null
+/*
+
+ Read/write Alan Map500 Waypoints, Routes and Tracklogs.
+
+ Provides "alanwpr" and "alantrl" formats for gpsbabel.
+ Currently supports OS 2.xx only.
+
+ Copyright (C) 2007 Gunar Megger, 0xff@quantentunnel.de
+ Copyright (C) 2002-2014 Robert Lipe, robertlipe+source@gpsbabel.org
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include <cctype> // for isprint
+#include <cstdio> // for snprintf, sprintf, SEEK_SET, size_t
+#include <cstdint> // for int16_t, int32_t, uint8_t, uint32_t, uint16_t, int8_t
+#include <cstring> // for memset, strlen, strncpy, memcpy, strncmp
+#include <ctime> // for gmtime, time, time_t
+
+#include <QtCore/QString> // for QString
+#include <QtCore/QVector> // for QVector
+
+#include "defs.h"
+#include "gbfile.h" // for gbfwrite, gbfile, gbfread, gbfclose, gbfopen, gbfseek
+#include "src/core/datetime.h" // for DateTime
+
+#define MYNAME "alan"
+
+#define MAXWPT 1000 /* old 500 */
+
+#define MAXRTE 50 /* old 20 */
+#define MAXWPTINRTE 150 /* old 30 */
+
+#define MAXTRK 8 /* old 5 */
+#define MAXPTINTRK 2500
+
+#define WPT_NAME_LEN 8
+#define WPT_COMMENT_LEN 12
+
+#define RTE_NAME_LEN 8
+#define RTE_COMMENT_LEN 12
+
+#define TRK_NAME_LEN 12
+#define TRK_COMMENT_LEN 13
+
+struct wpthdr {
+ uint32_t id;
+ int16_t num;
+ int16_t next;
+ int16_t idx[MAXWPT];
+ uint8_t used[MAXWPT];
+};
+
+struct wpt {
+ char name[WPT_NAME_LEN];
+ char comment[WPT_COMMENT_LEN];
+ struct {
+ int32_t x; /* degree * 36000 */
+ int32_t y; /* degree * 36000 */
+ } pt;
+ int32_t date;
+ int32_t time;
+ int16_t usecount;
+ int8_t checked;
+ int8_t reserved;
+};
+
+struct rtehdr {
+ uint32_t id;
+ int16_t num;
+ int16_t next;
+ int16_t idx[MAXRTE];
+ uint8_t used[MAXRTE];
+ int16_t rteno;
+};
+
+struct rte {
+ char name[RTE_NAME_LEN];
+ char comment[RTE_COMMENT_LEN];
+ int16_t wptnum;
+ int16_t wptidx[MAXWPTINRTE];
+ int16_t reserved;
+ int32_t date;
+ int32_t time;
+};
+
+struct wprdata {
+ struct wpthdr wpthdr;
+ struct wpt wpt[MAXWPT];
+ struct rtehdr rtehdr;
+ struct rte rte[MAXRTE];
+};
+
+struct trkhdr {
+ int16_t totalpt;
+ int16_t next;
+ char name[TRK_NAME_LEN]; /* 10, null terminated */
+ char comment[TRK_COMMENT_LEN]; /* 12, null terminated */
+ uint8_t reserved[3];
+ uint32_t occupied;
+ uint32_t show;
+ uint32_t fill;
+};
+
+struct loghdr {
+ uint32_t id;
+ int16_t num;
+ int16_t next;
+ int32_t date;
+ int32_t time;
+ struct trkhdr trkhdr[MAXTRK];
+};
+
+struct trklog {
+ struct {
+ int32_t x; /* degree * 36000 */
+ int32_t y; /* degree * 36000 */
+ } pt[MAXPTINTRK];
+ struct {
+ int16_t speed; /* km/h * 200 */
+ int16_t height; /* m * 5 */
+ } sh[MAXPTINTRK];
+};
+
+struct trldata {
+ struct loghdr loghdr;
+ struct trklog trklog[MAXTRK];
+};
+
+#define WPT_HDR_ID 0x5C38A600
+#define RTE_HDR_ID 0xD87F5900
+#define TRL_HDR_ID 0x38CB1200
+
+#define WPT_IDX_NONE -1 /* 0xffff */
+#define WPT_USED 0xff
+#define WPT_UNUSED 0
+#define WPT_CHECKED 1
+#define WPT_UNCHECKED 0
+
+#define RTE_IDX_NONE -1 /* 0xffff */
+#define RTE_USED 0xff
+#define RTE_UNUSED 0
+#define RTE_RTENO_NONE -1
+
+#define TRK_USED 1
+#define TRK_UNUSED 0
+#define TRK_SHOW 1
+#define TRK_HIDE 0
+#define TRK_FILL 1
+#define TRK_WRAP 0
+
+#define MAP500_PT_SCALE 36000.0
+#define pt2deg(P) ((double)(P) / MAP500_PT_SCALE)
+#define deg2pt(D) (int32_t)si_round((double)(D) * MAP500_PT_SCALE)
+
+#define MAP500_ALTITUDE_SCALE 5.0
+#define hgt2m(A) ((double)(A) / MAP500_ALTITUDE_SCALE)
+#define m2hgt(A) (int16_t)si_round((double)(A) * MAP500_ALTITUDE_SCALE)
+
+#define MAP500_SPEED_SCALE 720.0
+#define sp2mps(S) ((double)(S) / MAP500_SPEED_SCALE)
+#define mps2sp(S) (int16_t)si_round((double)(S) * MAP500_SPEED_SCALE)
+
+#define BYTEORDER_TEST 0x04030201 /* 32bit reference value */
+enum {
+ SWAP_NONE = 0x1234, /* map500 regular */
+ SWAP_BYTES = 0x2143, /* bytes swapped */
+ SWAP_WORDS = 0x3412, /* words swapped */
+ SWAP_BOTH = 0x4321 /* words + bytes swapped */
+};
+
+/**************************************************************************/
+
+static gbfile* fin = nullptr, *fout = nullptr;
+static struct wprdata WPR;
+static struct trldata TRL;
+
+static QVector<arglist_t> wpr_args = {
+ /*
+ {"os3", &osversion, "Operating system version 3",
+ NULL, ARGTYPE_BOOL, ARGNOMINMAX },
+ */
+};
+static QVector<arglist_t> trl_args = {
+ /*
+ {"os3", &osversion, "Operating system version 3",
+ NULL, ARGTYPE_BOOL, ARGNOMINMAX },
+ */
+};
+
+/**************************************************************************/
+// FIXME: Why is this code doing its own byte order conversion?
+static unsigned int byte_order()
+{
+ // avoid cppcheck error: The address of local variable 'test' is accessed at non-zero index.
+ // avoid undefined behavior accessing inactive union member.
+ // avoid "strict aliasing" warnings.
+ // see https://en.cppreference.com/w/cpp/language/reinterpret_cast#Notes
+ uint32_t test = BYTEORDER_TEST;
+ unsigned char ptr[4];
+
+ static_assert(sizeof ptr == sizeof test, "byte order test construction failure.");
+ memcpy(&ptr[0], &test, sizeof test);
+
+ unsigned int order = (ptr[0] << 12) | (ptr[1] << 8) | (ptr[2] << 4) | ptr[3];
+
+ return order;
+}
+
+static void sw_bytes(void* word)
+{
+ auto* p = (uint8_t*) word;
+ auto* r = (uint16_t*) word;
+
+ *r = (uint16_t)(p[1] << 8 | p[0]);
+}
+static void sw_words(void* dword)
+{
+ auto* p = (uint16_t*) dword;
+ auto* r = (uint32_t*) dword;
+
+ *r = (uint32_t)(p[0] << 16 | p[1]);
+}
+static void rev_bytes(void* dword)
+{
+ auto* p = (uint8_t*) dword;
+ auto* r = (uint32_t*) dword;
+
+ *r = (uint32_t)(p[3] << 24 | p[2] << 16 | p[1] << 8 | p[0]);
+}
+
+static void swap_wpthdr(struct wpthdr* wpthdr,
+ void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+ if (swap32_func != nullptr) {
+ swap32_func(&wpthdr->id);
+ }
+ if (swap16_func != nullptr) {
+ swap16_func(&wpthdr->num);
+ swap16_func(&wpthdr->next);
+ for (short &i : wpthdr->idx) {
+ swap16_func(&i);
+ }
+ }
+}
+
+static void swap_wpt(struct wpt* wpt,
+ void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+ if (swap16_func != nullptr) {
+ swap16_func(&wpt->usecount);
+ }
+ if (swap32_func != nullptr) {
+ swap32_func(&wpt->pt.x);
+ swap32_func(&wpt->pt.y);
+ swap32_func(&wpt->date);
+ swap32_func(&wpt->time);
+ }
+}
+
+static void swap_rtehdr(struct rtehdr* rtehdr,
+ void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+ if (swap16_func != nullptr) {
+ swap16_func(&rtehdr->num);
+ swap16_func(&rtehdr->next);
+ for (short &i : rtehdr->idx) {
+ swap16_func(&i);
+ }
+ swap16_func(&rtehdr->rteno);
+ }
+ if (swap32_func != nullptr) {
+ swap32_func(&rtehdr->id);
+ }
+}
+
+static void swap_rte(struct rte* rte,
+ void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+ if (swap16_func != nullptr) {
+ swap16_func(&rte->wptnum);
+ for (short &i : rte->wptidx) {
+ swap16_func(&i);
+ }
+ swap16_func(&rte->reserved);
+ }
+ if (swap32_func != nullptr) {
+ swap32_func(&rte->date);
+ swap32_func(&rte->time);
+ }
+}
+
+static void wpr_swap(struct wprdata* wprdata)
+{
+ void (*swap16_func)(void*);
+ void (*swap32_func)(void*);
+ int i;
+
+ switch (byte_order()) {
+ case SWAP_NONE: /* same byte oder, LITTLE_ENDIAN */
+ return;
+ break;
+ case SWAP_BOTH: /* swap words and bytes, BIG_ENDIAN */
+ swap16_func = sw_bytes;
+ swap32_func = rev_bytes;
+ break;
+ case SWAP_WORDS: /* swap words, PDP_ENDIAN */
+ swap16_func = nullptr;
+ swap32_func = sw_words;
+ break;
+ case SWAP_BYTES: /* swap bytes */
+ swap16_func = sw_bytes;
+ swap32_func = nullptr;
+ break;
+ default:
+ return; /* never reached */
+ }
+
+ swap_wpthdr(&(wprdata->wpthdr), swap16_func, swap32_func);
+ for (i=0; i< MAXWPT; i++) {
+ swap_wpt(&(wprdata->wpt[i]), swap16_func, swap32_func);
+ }
+ swap_rtehdr(&(wprdata->rtehdr), swap16_func, swap32_func);
+ for (i=0; i<MAXRTE; i++) {
+ swap_rte(&(wprdata->rte[i]), swap16_func, swap32_func);
+ }
+}
+
+static void swap_trkhdr(struct trkhdr* trkhdr,
+ void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+ if (swap16_func != nullptr) {
+ swap16_func(&(trkhdr->totalpt));
+ swap16_func(&(trkhdr->next));
+ }
+ if (swap32_func != nullptr) {
+ swap32_func(&(trkhdr->occupied));
+ swap32_func(&(trkhdr->show));
+ swap32_func(&(trkhdr->fill));
+ }
+}
+
+static void swap_loghdr(struct loghdr* loghdr,
+ void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+ if (swap16_func != nullptr) {
+ swap16_func(&(loghdr->num));
+ swap16_func(&(loghdr->next));
+ }
+ if (swap32_func != nullptr) {
+ swap32_func(&(loghdr->id));
+ swap32_func(&(loghdr->date));
+ swap32_func(&(loghdr->time));
+ }
+ for (auto &i : loghdr->trkhdr) {
+ swap_trkhdr(&i, swap16_func, swap32_func);
+ }
+}
+
+static void swap_trklog(struct trklog* trklog,
+ void (*swap16_func)(void*), void (*swap32_func)(void*))
+{
+ int i;
+
+ if (swap16_func != nullptr) {
+ for (i=0; i<MAXPTINTRK; i++) {
+ swap16_func(&(trklog->sh[i].speed));
+ swap16_func(&(trklog->sh[i].height));
+ }
+ }
+ if (swap32_func != nullptr) {
+ for (i=0; i<MAXPTINTRK; i++) {
+ swap32_func(&(trklog->pt[i].x));
+ swap32_func(&(trklog->pt[i].y));
+ }
+ }
+}
+
+static void trl_swap(struct trldata* trldata)
+{
+ void (*swap16_func)(void*);
+ void (*swap32_func)(void*);
+
+ switch (byte_order()) {
+ case SWAP_NONE: /* same byte oder, LITTLE_ENDIAN */
+ return;
+ break;
+ case SWAP_BOTH: /* swap words and bytes, BIG_ENDIAN */
+ swap16_func = sw_bytes;
+ swap32_func = rev_bytes;
+ break;
+ case SWAP_WORDS: /* swap words, PDP_ENDIAN */
+ swap16_func = nullptr;
+ swap32_func = sw_words;
+ break;
+ case SWAP_BYTES: /* swap bytes */
+ swap16_func = sw_bytes;
+ swap32_func = nullptr;
+ break;
+ default:
+ return; /* never reached */
+ }
+
+ swap_loghdr(&(trldata->loghdr), swap16_func, swap32_func);
+ for (auto &i : trldata->trklog) {
+ swap_trklog(&i, swap16_func, swap32_func);
+ }
+}
+
+
+/**************************************************************************/
+
+static void str2lab(char* dest, const char* src, int len, const char* fmt,
+ int n)
+{
+ int j = 0;
+ if (src != nullptr) {
+ for (int i=0; i<len && src[i] != '\0'; i++) {
+ if (isprint(src[i])) {
+ dest[j++] = src[i];
+ }
+ }
+ }
+ if (j == 0 && fmt != nullptr) {
+ snprintf(dest, len, fmt, n);
+ j = strlen(dest);
+ }
+ if (j < len) {
+ memset(dest+j, ' ', len-j);
+ }
+}
+
+static void str2lab(char* dest, const QString& src, int len, const char* fmt,
+ int n)
+{
+ str2lab(dest, CSTR(src), len, fmt, n);
+}
+
+static void pack_time(time_t t, int32_t* date, int32_t* time)
+{
+ struct tm* tm = gmtime(&t);
+ *date = tm->tm_mday | ((tm->tm_mon+1)<<8) | ((tm->tm_year+1900)<<16);
+ *time = t % 86400;
+}
+
+static time_t unpack_time(int32_t date, int32_t time)
+{
+ static int m_to_d[12] =
+ {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
+
+ short year = (date >> 16) & 0xffff;
+ short month = (date >> 8) & 0xff; /* 1-12 */
+ short day = date & 0xff; /* 1-31 */
+
+ month -= 1; /* fit struct tm */
+ year += month / 12;
+
+ if (month < 0) {
+ year -= 1;
+ month += 12;
+ }
+ time_t result = (year - 1970) * 365 + m_to_d[month];
+ if (month <= 1) {
+ year -= 1;
+ }
+ result += (year - 1968) / 4;
+ result -= (year - 1900) / 100;
+ result += (year - 1600) / 400;
+ result += day;
+ result -= 1;
+ result *= 86400;
+ result += time; /* map500 time is inseconds of the day */
+
+ return result;
+}
+
+/**************************************************************************/
+
+static Waypoint* get_wpt(struct wprdata* wprdata, unsigned n)
+{
+ int j;
+
+ struct wpthdr* wpthdr = &(wprdata->wpthdr);
+ int idx = wpthdr->idx[n];
+
+ if (idx == WPT_IDX_NONE || wpthdr->used[idx] == WPT_UNUSED) {
+ return nullptr;
+ }
+ struct wpt* wpt = &(wprdata->wpt[idx]);
+
+ auto* WP = new Waypoint;
+ WP->latitude = -pt2deg(wpt->pt.y);
+ WP->longitude = pt2deg(wpt->pt.x);
+ WP->SetCreationTime(unpack_time(wpt->date, wpt->time));
+ for (j=WPT_NAME_LEN-1; j >= 0 && wpt->name[j] == ' '; j--) {}
+ char *s = xstrndup(wpt->name,j+1);
+ WP->shortname = s;
+ xfree(s);
+ for (j=WPT_COMMENT_LEN-1; j >= 0 && wpt->comment[j] == ' '; j--) {}
+ if (j >= 0) {
+ char *descr = xstrndup(wpt->comment, j+1);
+ WP->description = descr;
+ xfree(descr);
+ } else {
+ WP->description = "";
+ }
+ WP->notes = "";
+
+ return WP;
+}
+
+static void wpr_read()
+{
+ struct wprdata wprdata;
+ int i, j;
+ Waypoint* WP;
+
+ if (gbfread(&wprdata, sizeof(struct wprdata), 1, fin) != 1) {
+ fatal(MYNAME ": Read error on '%s'. Perhaps this isn't an alan file\n", fin->name);
+ }
+ wpr_swap(&wprdata);
+ if (wprdata.wpthdr.id != WPT_HDR_ID ||
+ wprdata.rtehdr.id != RTE_HDR_ID) {
+ fatal(MYNAME ": %s is not in Alan .wpr format.\n", fin->name);
+ }
+
+ /* waypoints */
+ for (i=0; i<MAXWPT; i++) {
+ WP = get_wpt(&wprdata, i);
+ if (WP != nullptr) {
+ waypt_add(WP);
+ }
+ }
+
+ /* routes */
+ struct rtehdr* rtehdr = &(wprdata.rtehdr);
+ for (i=0; i<MAXRTE; i++) {
+ int idx = rtehdr->idx[i];
+ if (idx == RTE_IDX_NONE || rtehdr->used[idx] == RTE_UNUSED) {
+ continue;
+ }
+ struct rte* rte = &(wprdata.rte[idx]);
+
+ auto* RT = new route_head;
+ RT->rte_num = i;
+ for (j=RTE_NAME_LEN-1; j >= 0 && rte->name[j] == ' '; j--) {}
+ char *s = xstrndup(rte->name,j+1);
+ RT->rte_name = s;
+ xfree(s);
+ for (j=RTE_COMMENT_LEN-1; j >= 0 && rte->comment[j] == ' '; j--) {}
+ if (j >= 0) {
+ char *desc = xstrndup(rte->comment,j+1);
+ RT->rte_desc = desc;
+ xfree(desc);
+ } else {
+ RT->rte_desc = "";
+ }
+
+ route_add_head(RT);
+
+ /* route points */
+ for (j=0; j<rte->wptnum; j++) {
+ WP = get_wpt(&wprdata, rte->wptidx[j]);
+ if (WP != nullptr) {
+ route_add_wpt(RT, WP);
+ }
+ }
+ }
+}
+
+static void trl_read()
+{
+ struct trldata trldata;
+ int i, j;
+
+ for (i=0; i<MAXTRK; i+=2) {
+ gbfseek(fin, 0x10000 * (i/2), SEEK_SET);
+ if (gbfread(&(trldata.trklog[i]), sizeof(struct trklog), 2, fin) != 2) {
+ fatal(MYNAME ": Read error on '%s'. Perhaps this isn't an alan file.\n", fin->name);
+ }
+ }
+ gbfseek(fin, 0x10000 * MAXTRK/2, SEEK_SET);
+ if (gbfread(&(trldata.loghdr), sizeof(struct loghdr), 1, fin) != 1) {
+ fatal(MYNAME ": Read error on '%s'. Perhaps this isn't an alan file.\n", fin->name);
+ }
+ trl_swap(&trldata);
+ if (trldata.loghdr.id != TRL_HDR_ID) {
+ fatal(MYNAME ": %s is not in Alan .trl format.\n", fin->name);
+ }
+
+ for (i=0; i<MAXTRK; i++) {
+ /* track header */
+ struct trkhdr* trkhdr = &(trldata.loghdr.trkhdr[i]);
+ if (trkhdr->occupied == TRK_UNUSED) {
+ continue;
+ }
+ auto* TL = new route_head;
+ for (j=TRK_NAME_LEN-1;
+ j >= 0 && (trkhdr->name[j] == ' ' || trkhdr->name[j] == '\0');
+ j--) {}
+ char *s1 = xstrndup(trkhdr->name,j+1);
+ TL->rte_name = s1;
+ xfree(s1);
+ /* TL->rte_name[TRK_NAME_LEN+1] = 0; */ /* MAYBE BAD ADDRESS (Valgrind) */
+ for (j=TRK_COMMENT_LEN-1;
+ j >= 0 && (trkhdr->comment[j] == ' ' || trkhdr->comment[j] == '\0');
+ j--) {}
+ s1 = xstrndup(trkhdr->comment,j+1);
+ TL->rte_desc = s1;
+ xfree(s1);
+ /* TL->rte_desc[TRK_COMMENT_LEN+1] = 0; */ /* MAYBE BAD ADDRESS (Valgrind) */
+ TL->rte_num = i;
+
+ track_add_head(TL);
+
+ /* track points */
+ struct trklog* trklog = &(trldata.trklog[i]);
+ for (j=0; j<trkhdr->totalpt; j++) {
+ auto* WP = new Waypoint;
+ WP->latitude = -pt2deg(trklog->pt[j].y);
+ WP->longitude = pt2deg(trklog->pt[j].x);
+ WP->altitude = hgt2m(trklog->sh[j].height);
+ if (trklog->sh[j].speed >= 0)
+ WAYPT_SET(WP, speed, sp2mps(trklog->sh[j].speed));
+ else { /* bad speed < 0 - set to 0.0 */
+ WAYPT_UNSET(WP, speed);
+ }
+ track_add_wpt(TL, WP);
+ }
+ }
+}
+
+/**************************************************************************/
+
+static int find_wpt(struct wprdata* wprdata, const Waypoint* WP)
+{
+ struct wpt pattern;
+
+ str2lab(pattern.name, WP->shortname, WPT_NAME_LEN, nullptr, 0);
+ pattern.pt.x = deg2pt(WP->longitude);
+ pattern.pt.y = deg2pt(-WP->latitude);
+
+ struct wpt* wpt = wprdata->wpt;
+ for (int i = 0; i<MAXWPT; i++) {
+ int wpt_idx = wprdata->wpthdr.idx[i];
+ if (wpt_idx == WPT_IDX_NONE ||
+ wprdata->wpthdr.used[wpt_idx] == WPT_UNUSED) {
+ continue;
+ }
+ if (strncmp(wpt[wpt_idx].name, pattern.name, WPT_NAME_LEN) == 0 &&
+ wpt[wpt_idx].pt.x == pattern.pt.x &&
+ wpt[wpt_idx].pt.y == pattern.pt.y) {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+static int add_wpt(struct wprdata* wprdata, const Waypoint* WP,int isroute)
+{
+ struct wpt* wpt;
+ int i;
+
+ struct wpthdr* wpthdr = &(wprdata->wpthdr);
+
+ int hdr_idx = find_wpt(wprdata, WP);
+ if (hdr_idx >= 0) {
+ /* duplicate waypoint */
+ if (isroute) {
+ wpt = &(wprdata->wpt[wpthdr->idx[hdr_idx]]);
+ wpt->usecount ++;
+ }
+ return hdr_idx;
+ }
+
+ for (i=0; i<MAXWPT && wpthdr->idx[i] != WPT_IDX_NONE; i++) { }
+ hdr_idx = i;
+ for (i=0; i<MAXWPT && wpthdr->used[i] != WPT_UNUSED; i++) { }
+ int wpt_idx = i;
+ if (wpthdr->num >= MAXWPT || hdr_idx >= MAXWPT || wpt_idx >= MAXWPT) {
+ fatal(MYNAME ": Can't store more than %u waypoints\n", MAXWPT);
+ }
+
+ wpt = &(wprdata->wpt[wpt_idx]);
+ str2lab(wpt->name, WP->shortname, WPT_NAME_LEN, "W%05d", wpt_idx);
+ str2lab(wpt->comment, WP->description, WPT_COMMENT_LEN, nullptr, 0);
+ wpt->pt.x = deg2pt(WP->longitude);
+ wpt->pt.y = deg2pt(-WP->latitude);
+ wpt->usecount = isroute ? 1 : 0;
+ wpt->checked = isroute ? 0 : 1;
+ wpt->reserved = 0;
+ pack_time(WP->GetCreationTime().toTime_t(), &(wpt->date), &(wpt->time));
+
+ wpthdr->idx[hdr_idx] = wpt_idx;
+ wpthdr->used[wpt_idx] = WPT_USED;
+ wpthdr->num++;
+ wpthdr->next++;
+ if (wpthdr->next >= MAXWPT) { /* overrun */
+ wpthdr->next = 0;
+ }
+
+ return hdr_idx;
+}
+
+static void wpr_waypoint(const Waypoint* WP)
+{
+ add_wpt(&WPR, WP, 0);
+}
+
+static void wpr_route_hdr(const route_head* RT)
+{
+ int i;
+
+ struct rtehdr* rtehdr = &(WPR.rtehdr);
+ for (i=0; i<MAXRTE && rtehdr->idx[i] != RTE_IDX_NONE; i++) { }
+ int hdr_idx = i;
+ for (i=0; i<MAXRTE && rtehdr->used[i] != RTE_UNUSED; i++) { }
+ int rte_idx = i;
+ if (rtehdr->num >= MAXRTE || hdr_idx >= MAXRTE || rte_idx >= MAXRTE) {
+ fatal(MYNAME ": Can't store more than %u routes", MAXRTE);
+ }
+
+ struct rte* rte = &(WPR.rte[rte_idx]);
+ str2lab(rte->name, RT->rte_name, RTE_NAME_LEN, "R%03d", rte_idx);
+ str2lab(rte->comment, RT->rte_desc, RTE_COMMENT_LEN, nullptr, 0);
+ pack_time(time(nullptr), &(rte->date), &(rte->time));
+
+ rtehdr->idx[hdr_idx] = rte_idx;
+ rtehdr->used[rte_idx] = RTE_USED;
+ rtehdr->num++;
+ rtehdr->next++;
+ if (rtehdr->next >= MAXRTE) { /* overrun */
+ rtehdr->next = 0;
+ }
+
+ /* if you want the new route to be active, uncomment the next line */
+ /* rtehdr->rteno = rte_idx; */
+}
+
+static void wpr_route_wpt(const Waypoint* WP)
+{
+ struct rte* rte = &(WPR.rte[WPR.rtehdr.num -1]);
+ if (rte->wptnum >= MAXWPTINRTE) {
+ fatal(MYNAME ": Can't store more than %u waypoints per route", MAXWPTINRTE);
+ }
+
+ int wpt_idx = add_wpt(&WPR, WP, 1);
+
+ rte->wptidx[rte->wptnum] = wpt_idx;
+ rte->wptnum ++;
+}
+
+static void wpr_route_trl(const route_head*)
+{
+ /* should we do some final sanity checks? */
+}
+
+static void wpr_write()
+{
+ int i;
+
+ WPR.wpthdr.id = WPT_HDR_ID;
+ WPR.wpthdr.num = WPR.wpthdr.next = 0;
+ for (i=0; i<MAXWPT; i++) {
+ WPR.wpthdr.idx[i] = WPT_IDX_NONE;
+ WPR.wpthdr.used[i] = WPT_UNUSED;
+ }
+ memset(WPR.wpt, 0, MAXWPT * sizeof(struct wpt));
+ WPR.rtehdr.id = RTE_HDR_ID;
+ WPR.rtehdr.num = WPR.rtehdr.next = 0;
+ for (i=0; i<MAXRTE; i++) {
+ WPR.rtehdr.idx[i] = RTE_IDX_NONE;
+ WPR.rtehdr.used[i] = RTE_UNUSED;
+ }
+ WPR.rtehdr.rteno = RTE_RTENO_NONE;
+ memset(WPR.rte, 0, MAXRTE * sizeof(struct rte));
+
+ waypt_disp_all(wpr_waypoint);
+ route_disp_all(wpr_route_hdr, wpr_route_trl, wpr_route_wpt);
+
+ wpr_swap(&WPR);
+ if (gbfwrite(&WPR, sizeof(struct wprdata), 1, fout) != 1) {
+ fatal(MYNAME ": Write error on %s\n", fout->name);
+ }
+}
+
+/**************************************************************************/
+
+static void trl_track_hdr(const route_head* TL)
+{
+ int idx;
+
+ struct trkhdr* trkhdr = TRL.loghdr.trkhdr;
+
+ for (idx=0; idx< MAXTRK && trkhdr[idx].occupied != TRK_UNUSED; idx++) {}
+ if (idx >= MAXTRK) {
+ fatal(MYNAME ": Can't store more than %u tracklogs", MAXTRK);
+ }
+
+ if (!TL->rte_name.isEmpty()) {
+ strncpy(trkhdr[idx].name, CSTRc(TL->rte_name), TRK_NAME_LEN - 1);
+ }
+ if (*(trkhdr[idx].name) == '\0') {
+ sprintf(trkhdr[idx].name, "T%03d", idx);
+ }
+ trkhdr[idx].name[TRK_NAME_LEN-1] = '\0';
+
+ if (!TL->rte_desc.isEmpty()) {
+ strncpy(trkhdr[idx].comment, CSTRc(TL->rte_desc), TRK_COMMENT_LEN - 1);
+ int l = strlen(CSTRc(TL->rte_desc));
+ if (l < TRK_COMMENT_LEN-1) {
+ memset(trkhdr[idx].comment + l, ' ', TRK_COMMENT_LEN - 1 - l);
+ }
+ }
+ trkhdr[idx].comment[TRK_COMMENT_LEN-1] = '\0';
+
+ trkhdr[idx].occupied = TRK_USED;
+ trkhdr[idx].totalpt = 0;
+ trkhdr[idx].next = 0;
+
+ TRL.loghdr.num = idx;
+}
+
+static void trl_track_wpt(const Waypoint* WP)
+{
+ int trk_idx = TRL.loghdr.num;
+
+ struct trkhdr* trkhdr = &(TRL.loghdr.trkhdr[trk_idx]);
+ if (trkhdr->totalpt >= MAXPTINTRK) {
+ fatal(MYNAME ": Can't store more than %u points per track", MAXPTINTRK);
+ }
+ int log_idx = trkhdr->next;
+
+ struct trklog* trklog = &(TRL.trklog[trk_idx]);
+ trklog->pt[log_idx].x = deg2pt(WP->longitude);
+ trklog->pt[log_idx].y = deg2pt(-WP->latitude);
+ if WAYPT_HAS(WP, speed) {
+ trklog->sh[log_idx].speed = mps2sp(WP->speed);
+ }
+ if (WP->altitude != unknown_alt) {
+ trklog->sh[log_idx].height = m2hgt(WP->altitude);
+ }
+
+ trkhdr->totalpt ++;
+ trkhdr->next = trkhdr->totalpt;
+}
+
+static void trl_track_tlr(const route_head*)
+{
+ int trk_idx = TRL.loghdr.num;
+ struct trkhdr* trkhdr = &(TRL.loghdr.trkhdr[trk_idx]);
+
+ if (trkhdr->totalpt == 0) {
+ trkhdr->occupied = TRK_UNUSED;
+ }
+
+ TRL.loghdr.num = -1;
+}
+
+static void trl_write()
+{
+ int i;
+
+ TRL.loghdr.id = TRL_HDR_ID;
+ TRL.loghdr.num = TRL.loghdr.next = -1;
+ TRL.loghdr.date = TRL.loghdr.time = 0;
+ for (i=0; i<MAXTRK; i++) {
+ struct trkhdr* trkhdr = &(TRL.loghdr.trkhdr[i]);
+ trkhdr->totalpt = 0;
+ trkhdr->next = 0;
+ memset(trkhdr->name, 0, TRK_NAME_LEN);
+ memset(trkhdr->comment, ' ', TRK_COMMENT_LEN);
+ trkhdr->comment[TRK_COMMENT_LEN-1] = '\0';
+ trkhdr->occupied = TRK_UNUSED;
+ trkhdr->show = TRK_HIDE;
+ trkhdr->fill = TRK_FILL;
+ }
+ memset(TRL.trklog, 0xff, sizeof(struct trklog) * MAXTRK);
+
+ track_disp_all(trl_track_hdr, trl_track_tlr, trl_track_wpt);
+
+ trl_swap(&TRL);
+
+ size_t fill = 0x10000 - 2 * sizeof(struct trklog);
+ void* buf = xmalloc(fill);
+ if (buf == nullptr) {
+ fatal(MYNAME ": Not enough memory\n");
+ }
+ memset(buf, 0xff, fill);
+
+ for (i=0; i<MAXTRK; i+=2) {
+ if (gbfwrite(&(TRL.trklog[i]), sizeof(struct trklog), 2, fout) != 2 ||
+ gbfwrite(buf, fill, 1, fout) != 1) {
+ fatal(MYNAME ": Write error on %s\n", fout->name);
+ }
+ }
+ xfree(buf);
+
+ fill = 0x1000 - sizeof(struct loghdr);
+ buf = xmalloc(fill);
+ if (buf == nullptr) {
+ fatal(MYNAME ": Not enough memory\n");
+ }
+ memset(buf, 0xff, fill);
+
+ if (gbfwrite(&(TRL.loghdr), sizeof(struct loghdr), 1, fout) != 1 ||
+ gbfwrite(buf, fill, 1, fout) != 1) {
+ fatal(MYNAME ": Write error on %s\n", fout->name);
+ }
+ xfree(buf);
+}
+
+/**************************************************************************/
+
+static void alan_rd_init(const QString& fname)
+{
+ fin = gbfopen(fname, "rb", MYNAME);
+}
+
+static void alan_rd_deinit()
+{
+ gbfclose(fin);
+ fin = nullptr;
+}
+
+
+static void alan_wr_init(const QString& fname)
+{
+ fout = gbfopen(fname, "wb", MYNAME);
+}
+
+static void alan_wr_deinit()
+{
+ gbfclose(fout);
+ fout = nullptr;
+}
+
+/**************************************************************************/
+
+ff_vecs_t alanwpr_vecs = {
+ ff_type_file,
+ {
+ (ff_cap)(ff_cap_read | ff_cap_write) /* waypoints */,
+ ff_cap_none /* tracks */,
+ (ff_cap)(ff_cap_read | ff_cap_write) /* routes */
+ },
+ alan_rd_init,
+ alan_wr_init,
+ alan_rd_deinit,
+ alan_wr_deinit,
+ wpr_read,
+ wpr_write,
+ nullptr,
+ &wpr_args,
+ CET_CHARSET_ASCII, 0, /* ascii is the expected character set */
+ /* not fixed, can be changed through command line parameter */
+ NULL_POS_OPS,
+ nullptr
+};
+
+ff_vecs_t alantrl_vecs = {
+ ff_type_file,
+ {
+ ff_cap_none /* waypoints */,
+ (ff_cap)(ff_cap_read | ff_cap_write) /* tracks */,
+ ff_cap_none /* routes */
+ },
+ alan_rd_init,
+ alan_wr_init,
+ alan_rd_deinit,
+ alan_wr_deinit,
+ trl_read,
+ trl_write,
+ nullptr,
+ &trl_args,
+ CET_CHARSET_ASCII, 0, /* ascii is the expected character set */
+ /* not fixed, can be changed through command line parameter */
+ NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+ Read DeLorme drawing files (.an1)
+
+ Copyright (C) 2005-2014 Ron Parker and Robert Lipe.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include <cstdio> // for sprintf, SEEK_CUR
+#include <cstdint> // for int32_t
+#include <cstdlib> // for atoi, atof
+#include <cstring> // for strlen, strchr, memcpy, strstr
+
+#include <QtCore/QString> // for QString
+#include <QtCore/QVector> // for QVector
+
+#include "defs.h"
+#include "formspec.h" // for FsChainAdd, FsChainFind, FormatSpecificData, kFsAn1L, kFsAn1V, kFsAn1W
+#include "gbfile.h" // for gbfgetint32, gbfputint32, gbfputint16, gbfgetint16, gbfile, gbfputs, gbfgetc, gbfputc, gbfclose, gbfopen_le, gbfgetdbl, gbfputdbl, gbfread, gbfseek
+#include "src/core/datetime.h" // for DateTime
+
+
+#define MYNAME "an1"
+
+static gbfile* infile;
+static gbfile* outfile;
+
+static char* output_type = nullptr;
+static char* road_changes = nullptr;
+static char* nogc = nullptr;
+static char* nourl = nullptr;
+static char* opt_symbol = nullptr;
+static char* opt_color = nullptr;
+static char* opt_zoom = nullptr;
+static char* opt_wpt_type = nullptr;
+static char* opt_radius = nullptr;
+
+static short output_type_num = 0;
+static short opt_zoom_num = 0;
+static long opt_color_num = 0;
+static short wpt_type_num = 0;
+static short last_read_type = 0;
+static double radius = 0.0;
+
+static long serial=10000;
+static long rtserial=1;
+
+struct roadchange {
+ long type;
+ char* name;
+};
+
+static roadchange* roadchanges = nullptr;
+
+static
+QVector<arglist_t> an1_args = {
+ {
+ "type", &output_type, "Type of .an1 file",
+ "", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "road", &road_changes, "Road type changes",
+ "", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "nogc", &nogc, "Do not add geocache data to description",
+ nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+ },
+ {
+ "nourl", &nourl, "Do not add URLs to description",
+ nullptr, ARGTYPE_BOOL, ARG_NOMINMAX, nullptr
+ },
+ {
+ "deficon", &opt_symbol, "Symbol to use for point data",
+ "Red Flag", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "color", &opt_color, "Color for lines or mapnotes",
+ "red", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "zoom", &opt_zoom, "Zoom level to reduce points",
+ nullptr, ARGTYPE_INT, ARG_NOMINMAX, nullptr
+ },
+ {
+ "wpt_type", &opt_wpt_type,
+ "Waypoint type",
+ "", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "radius", &opt_radius, "Radius for circles",
+ nullptr, ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+};
+
+struct guid_t {
+ unsigned long l;
+ unsigned short s[3];
+ unsigned char c[6];
+};
+
+#include "an1sym.h"
+
+#define ReadShort(f) gbfgetint16(f)
+#define WriteShort(f,s) gbfputint16((s),f)
+#define ReadLong(f) gbfgetint32(f)
+#define WriteLong(f,l) gbfputint32((l),f)
+#define ReadDouble(f) gbfgetdbl(f)
+#define WriteDouble(f,d) gbfputdbl((d),f)
+
+static char*
+ReadString(gbfile* f, short len)
+{
+ auto* result = (char*)xcalloc(1, len + 1);
+ if (len) {
+ gbfread(result, 1, len, f);
+ }
+ return result;
+}
+
+#define ReadChar(f) (unsigned char) gbfgetc(f)
+#define WriteChar(f,c) gbfputc((unsigned char)(c),f)
+#define WriteString(f,s) gbfputs((s),f)
+
+static void
+ReadGuid(gbfile* f, guid_t* guid)
+{
+ guid->l = ReadLong(f);
+ for (unsigned short& i : guid->s) {
+ i = ReadShort(f);
+ }
+ for (unsigned char& i : guid->c) {
+ i = ReadChar(f);
+ }
+}
+
+static void
+WriteGuid(gbfile* f, guid_t* guid)
+{
+ WriteLong(f, guid->l);
+ for (int i = 0; i < 3; i++) {
+ WriteShort(f, guid->s[i]);
+ }
+ for (int i = 0; i < 6; i++) {
+ WriteChar(f, guid->c[i]);
+ }
+}
+
+static void
+Skip(gbfile* f,
+ unsigned long distance)
+{
+ gbfseek(f, distance, SEEK_CUR);
+}
+
+static double
+DecodeOrd(long ord)
+{
+ return (double)((int32_t)(0x80000000 - ord)) / 0x800000;
+}
+
+static long
+EncodeOrd(double ord)
+{
+ return (int32_t)(0x80000000 - (int32_t)(ord * 0x800000));
+}
+
+struct an1_symbol_record {
+ short hotspotxhi{0};
+ long hotspoty{0};
+ long unk1{0};
+ guid_t guid{};
+ char* name{nullptr};
+};
+
+struct an1_waypoint_record : FormatSpecificData {
+ an1_waypoint_record() : FormatSpecificData(kFsAn1W) {}
+private:
+ an1_waypoint_record(const an1_waypoint_record&) = default;
+public:
+ an1_waypoint_record& operator=(const an1_waypoint_record&) = delete;
+ an1_waypoint_record(an1_waypoint_record&&) = delete;
+ an1_waypoint_record& operator=(an1_waypoint_record&&) = delete;
+ ~an1_waypoint_record() override
+ {
+ xfree(name);
+ xfree(fontname);
+ xfree(url);
+ xfree(comment);
+ xfree(image_name);
+ }
+
+ an1_waypoint_record* clone() const override
+ {
+ auto* copy = new an1_waypoint_record(*this);
+ copy->name = xstrdup(name);
+ copy->fontname = xstrdup(fontname);
+ copy->url = xstrdup(url);
+ copy->comment = xstrdup(comment);
+ copy->image_name = xstrdup(image_name);
+ return copy;
+ }
+
+ short magic{0};
+ long unk1{0};
+ long lon{0};
+ long lat{0};
+ short type{0};
+ long height{0};
+ long width{0};
+ short unk2{0};
+ short unk3{0};
+ short serial{0};
+ short unk4{0};
+ unsigned char create_zoom{0};
+ unsigned char visible_zoom{0};
+ short unk5{0};
+ double radius{0.0}; /* in km */
+ char* name{nullptr};
+ char* fontname{nullptr};
+ guid_t guid{};
+ long fontcolor{0};
+ long fontstyle{0};
+ long fontsize{0};
+ long outlineweight{0};
+ long outlinecolor{0};
+ long outlineflags{0};
+ long fillcolor{0};
+ long unk6{0};
+ long fillflags{0};
+
+ /* Added in SA2006/Topo 6.0 */
+ short unk6_1{0};
+ char* url{nullptr};
+ char* comment{nullptr};
+ long creation_time{0};
+ long modification_time{0};
+ char* image_name{nullptr};
+};
+
+struct an1_vertex_record : FormatSpecificData {
+ an1_vertex_record() : FormatSpecificData(kFsAn1V) {}
+ an1_vertex_record* clone() const override
+ {
+ return new an1_vertex_record(*this);
+ }
+
+ short magic{0};
+ long unk0{0};
+ long lon{0};
+ long lat{0};
+ short unk1{0};
+};
+
+struct an1_line_record : FormatSpecificData {
+ an1_line_record() : FormatSpecificData(kFsAn1L) {}
+private:
+ an1_line_record(const an1_line_record&) = default;
+public:
+ an1_line_record& operator=(const an1_line_record&) = delete;
+ an1_line_record(an1_line_record&&) = delete;
+ an1_line_record& operator=(an1_line_record&&) = delete;
+ ~an1_line_record() override
+ {
+ xfree(name);
+ }
+
+ an1_line_record* clone() const override
+ {
+ auto* copy = new an1_line_record(*this);
+ copy->name = xstrdup(name);
+ return copy;
+ }
+
+ long roadtype{0};
+ short serial{0};
+ long unk2{0};
+ short unk3{0};
+ short type{0};
+ long unk4{0};
+ char* name{nullptr};
+ long lineweight{0};
+ long linestyle{0};
+ long linecolor{0};
+ long opacity{0};
+ long polyfillcolor{0};
+ long unk6{0};
+ long unk7{0};
+ short unk8{0};
+ long pointcount{0};
+};
+
+static void Destroy_AN1_Symbol(an1_symbol_record* symbol)
+{
+ xfree(symbol->name);
+}
+
+static void Read_AN1_Waypoint(gbfile* f, an1_waypoint_record* wpt)
+{
+ wpt->magic = ReadShort(f);
+ wpt->unk1 = ReadLong(f);
+ wpt->lon = ReadLong(f);
+ wpt->lat = ReadLong(f);
+ wpt->type = ReadShort(f);
+ wpt->height = ReadLong(f);
+ wpt->width = ReadLong(f);
+ wpt->unk2 = ReadShort(f);
+ wpt->unk3 = ReadShort(f);
+ wpt->serial = ReadShort(f);
+ wpt->unk4 = ReadShort(f);
+ wpt->create_zoom = ReadChar(f);
+ wpt->visible_zoom = ReadChar(f);
+ wpt->unk5 = ReadShort(f);
+ wpt->radius = ReadDouble(f);
+ unsigned short len = ReadShort(f);
+ wpt->name = ReadString(f, len);
+
+ if (len != strlen(wpt->name)) {
+ /* This happens in 06/6.0 files that put extra data in the
+ * name record for backward compatibility's sake */
+ char* ofs = wpt->name + strlen(wpt->name) + 1;
+ wpt->unk6_1 = le_read16(ofs);
+ ofs += 2;
+
+ len = le_read16(ofs);
+ ofs += 2;
+
+ if (len) {
+ /*
+ * Trust URL encoded in new format over one in
+ * old format if both are present. Whack the
+ * name starting at '{URL='.
+ */
+ char* oldurlstr = strstr(wpt->name, "{URL=");
+ if (oldurlstr) {
+ *oldurlstr = 0;
+ }
+ wpt->url = (char*) xcalloc(len+1, 1);
+ memcpy(wpt->url, ofs, len);
+ ofs += len;
+ }
+
+ len = le_read16(ofs);
+ ofs += 2;
+
+ if (len) {
+ wpt->comment = (char*) xcalloc(len+1, 1);
+ memcpy(wpt->comment, ofs, len);
+ ofs += len;
+ }
+
+ /* these are quadwords, presumably for year-2038 compat. */
+ wpt->creation_time = le_read32(ofs);
+ ofs += 8;
+
+ wpt->modification_time = le_read32(ofs);
+ ofs += 8;
+ }
+
+ if (wpt->type == 0x12) {
+ /* 'image' type */
+ ReadShort(f); /* length of font + filename */
+ len = ReadShort(f);
+ wpt->fontname = ReadString(f, len);
+ len = ReadShort(f);
+ wpt->image_name = ReadString(f, len);
+ } else {
+ len = ReadShort(f);
+ wpt->fontname = ReadString(f, len);
+ wpt->image_name = nullptr;
+ }
+ ReadGuid(f, &wpt->guid);
+ wpt->fontcolor = ReadLong(f);
+ wpt->fontstyle = ReadLong(f);
+ wpt->fontsize = ReadLong(f);
+ wpt->outlineweight = ReadLong(f);
+ wpt->outlinecolor = ReadLong(f);
+ wpt->outlineflags = ReadLong(f);
+ wpt->fillcolor = ReadLong(f);
+ wpt->unk6 = ReadLong(f);
+ wpt->fillflags = ReadLong(f);
+}
+
+static void Write_AN1_Waypoint(gbfile* f, an1_waypoint_record* wpt)
+{
+ WriteShort(f, wpt->magic);
+ WriteLong(f, wpt->unk1);
+ WriteLong(f, wpt->lon);
+ WriteLong(f, wpt->lat);
+ WriteShort(f, wpt->type);
+ WriteLong(f, wpt->height);
+ WriteLong(f, wpt->width);
+ WriteShort(f, wpt->unk2);
+ WriteShort(f, wpt->unk3);
+ WriteShort(f, wpt->serial);
+ WriteShort(f, wpt->unk4);
+ WriteChar(f, wpt->create_zoom);
+ WriteChar(f, wpt->visible_zoom);
+ WriteShort(f, wpt->unk5);
+ WriteDouble(f, wpt->radius);
+
+ short len = strlen(wpt->name) + 1 + 2 + 2 +
+ (wpt->url ? strlen(wpt->url) : 0) + 2 +
+ (wpt->comment ? strlen(wpt->comment) : 0) + 8 + 8;
+ WriteShort(f, len);
+ WriteString(f, wpt->name);
+ WriteChar(f, 0); /* name string terminator */
+
+ WriteShort(f, wpt->unk6_1);
+
+ if (wpt->url) {
+ WriteShort(f, strlen(wpt->url));
+ WriteString(f, wpt->url);
+ } else {
+ WriteShort(f, 0);
+ }
+
+ if (wpt->comment) {
+ WriteShort(f, strlen(wpt->comment));
+ WriteString(f, wpt->comment);
+ } else {
+ WriteShort(f, 0);
+ }
+
+ WriteLong(f, wpt->creation_time);
+ WriteLong(f, 0);
+
+ WriteLong(f, wpt->modification_time);
+ WriteLong(f, 0);
+
+ if (wpt->type == 0x12) { /* image */
+ len = 2 + (wpt->fontname ? strlen(wpt->fontname) : 0) +
+ 2 + (wpt->image_name ? strlen(wpt->image_name) : 0);
+ WriteShort(f, len);
+ if (wpt->fontname) {
+ len = strlen(wpt->fontname);
+ WriteShort(f, len);
+ WriteString(f, wpt->fontname);
+ } else {
+ WriteShort(f, 0);
+ }
+ if (wpt->image_name) {
+ len = strlen(wpt->image_name);
+ WriteShort(f, len);
+ WriteString(f, wpt->image_name);
+ } else {
+ WriteShort(f, 0);
+ }
+ } else {
+ len = strlen(wpt->fontname);
+ WriteShort(f, len);
+ WriteString(f, wpt->fontname);
+ }
+ WriteGuid(f, &wpt->guid);
+ WriteLong(f, wpt->fontcolor);
+ WriteLong(f, wpt->fontstyle);
+ WriteLong(f, wpt->fontsize);
+ WriteLong(f, wpt->outlineweight);
+ WriteLong(f, wpt->outlinecolor);
+ WriteLong(f, wpt->outlineflags);
+ WriteLong(f, wpt->fillcolor);
+ WriteLong(f, wpt->unk6);
+ WriteLong(f, wpt->fillflags);
+}
+
+static void Read_AN1_Vertex(gbfile* f, an1_vertex_record* vertex)
+{
+
+ vertex->magic = ReadShort(f);
+ vertex->unk0 = ReadLong(f);
+ vertex->lon = ReadLong(f);
+ vertex->lat = ReadLong(f);
+ vertex->unk1 = ReadShort(f);
+}
+
+static void Write_AN1_Vertex(gbfile* f, an1_vertex_record* vertex)
+{
+ WriteShort(f, vertex->magic);
+ WriteLong(f, vertex->unk0);
+ WriteLong(f, vertex->lon);
+ WriteLong(f, vertex->lat);
+ WriteShort(f, vertex->unk1);
+}
+
+static void Read_AN1_Line(gbfile* f, an1_line_record* line)
+{
+ line->roadtype = ReadLong(f);
+ line->serial = ReadShort(f);
+ line->unk2 = ReadLong(f);
+ line->unk3 = ReadShort(f);
+ line->type = ReadShort(f);
+ line->unk4 = ReadLong(f);
+ short len = ReadShort(f);
+ line->name = ReadString(f, len);
+ line->lineweight = ReadShort(f);
+ line->linestyle = ReadLong(f);
+ line->linecolor = ReadLong(f);
+ line->opacity = ReadLong(f);
+ line->polyfillcolor = ReadLong(f);
+ line->unk6 = ReadLong(f);
+ line->unk7 = ReadLong(f);
+ line->unk8 = ReadShort(f);
+ line->pointcount = ReadLong(f);
+}
+
+static void Write_AN1_Line(gbfile* f, an1_line_record* line)
+{
+ WriteLong(f, line->roadtype);
+ WriteShort(f, line->serial);
+ WriteLong(f, line->unk2);
+ WriteShort(f, line->unk3);
+ WriteShort(f, line->type);
+ WriteLong(f, line->unk4);
+ short len = strlen(line->name);
+ WriteShort(f, len);
+ WriteString(f, line->name);
+ WriteShort(f, (short) line->lineweight);
+ WriteLong(f, line->linestyle);
+ WriteLong(f, line->linecolor);
+ WriteLong(f, line->opacity);
+ WriteLong(f, line->polyfillcolor);
+ WriteLong(f, line->unk6);
+ WriteLong(f, line->unk7);
+ WriteShort(f, line->unk8);
+ WriteLong(f, line->pointcount);
+}
+
+static void Skip_AN1_IL(gbfile* f)
+{
+ Skip(f, 26);
+}
+
+static void Skip_AN1_BM(gbfile* f)
+{
+ Skip(f, 8); /* BITMAPFILEHEADER fields 1-3 */
+ unsigned long bitoffset = ReadLong(f);
+
+ unsigned long bmisize = ReadLong(f);
+ Skip(f, 16); /* BITMAPINFOHEADER fields 2-6 */
+ unsigned long bmsize = ReadLong(f);
+ Skip(f, 16); /* BITMAPINFOHEADER fields 8-11 */
+
+ unsigned long palettesize = bitoffset - bmisize - 14;
+ Skip(f, bmsize + palettesize);
+}
+
+static void Read_AN1_Symbol(gbfile* f, an1_symbol_record* symbol)
+{
+ /* This is just the high word of a long; we ate the low
+ * word in the caller. Fortunately, we don't care. */
+ symbol->hotspotxhi = ReadShort(f);
+ symbol->hotspoty = ReadLong(f);
+ symbol->unk1 = ReadLong(f);
+ ReadGuid(f, &symbol->guid);
+ short len = ReadChar(f);
+ symbol->name = ReadString(f, len);
+}
+
+static void Read_AN1_Header(gbfile* f)
+{
+ unsigned short magic = ReadShort(f);
+ (void) magic; // hush warning.
+ unsigned short type = ReadShort(f);
+
+ last_read_type = type;
+}
+
+static void Write_AN1_Header(gbfile* f)
+{
+ WriteShort(f, 11557);
+ WriteShort(f, output_type_num);
+}
+
+static void Read_AN1_Bitmaps(gbfile* f)
+{
+ an1_symbol_record symbol;
+
+ long count = ReadLong(f);
+
+ while (count) {
+ unsigned short magic = ReadShort(f);
+ switch (magic) {
+ case 0x4d42:
+ Skip_AN1_BM(f);
+ break;
+ case 0x4c49:
+ Skip_AN1_IL(f);
+ break;
+ default:
+ Read_AN1_Symbol(f, &symbol);
+ Destroy_AN1_Symbol(&symbol);
+ count--;
+ break;
+ }
+ }
+
+ /* Read the symbol table */
+}
+
+static void Write_AN1_Bitmaps(gbfile* f)
+{
+ /* On write, we don't output any bitmaps, so writing them
+ * is just a matter of writing a count of zero */
+ WriteLong(f, 0);
+}
+
+static void Read_AN1_Waypoints(gbfile* f)
+{
+ const char* icon = nullptr;
+ ReadShort(f);
+ unsigned long count = ReadLong(f);
+ for (unsigned long i = 0; i < count; i++) {
+ auto* rec = new an1_waypoint_record;
+ Read_AN1_Waypoint(f, rec);
+ auto* wpt_tmp = new Waypoint;
+
+ if (rec->creation_time) {
+ wpt_tmp->SetCreationTime(rec->creation_time);
+ }
+ wpt_tmp->longitude = -DecodeOrd(rec->lon);
+ wpt_tmp->latitude = DecodeOrd(rec->lat);
+ wpt_tmp->notes = rec->comment;
+ wpt_tmp->description = rec->name;
+
+ if (rec->url) {
+ wpt_tmp->AddUrlLink(rec->url);
+ } else {
+ int u = wpt_tmp->description.indexOf("{URL=");
+ if (u != -1) {
+ QString us = wpt_tmp->description.mid(u);
+ us.remove(0,5); // throw away anything up to and including "{URL="
+ us.chop(1); // throw away final character, assumed to be "}"
+ if (!us.isEmpty()) {
+ wpt_tmp->AddUrlLink(us);
+ }
+ }
+ }
+
+ if (rec->image_name) {
+ wpt_tmp->icon_descr = rec->image_name;
+ } else if (FindIconByGuid(&rec->guid, &icon)) {
+ wpt_tmp->icon_descr = icon;
+ }
+
+ wpt_tmp->fs.FsChainAdd(rec);
+ rec = nullptr;
+ waypt_add(wpt_tmp);
+ }
+}
+
+static void
+Write_One_AN1_Waypoint(const Waypoint* wpt)
+{
+ an1_waypoint_record* rec;
+
+ const auto* source_rec = reinterpret_cast<an1_waypoint_record*>(wpt->fs.FsChainFind(kFsAn1W));
+
+ if (source_rec != nullptr) {
+ rec = source_rec->clone();
+ if (opt_zoom) {
+ rec->visible_zoom = opt_zoom_num;
+ }
+ } else {
+ rec = new an1_waypoint_record;
+ rec->magic = 1;
+ rec->type = wpt_type_num;
+ rec->unk2 = 3;
+ rec->unk3 = 18561;
+ rec->radius = radius;
+ rec->fillcolor = opt_color_num;
+ rec->fillflags = 3;
+ if (wpt_type_num == 5) {
+ rec->fillflags = 0x8200;
+ }
+ rec->height = -50;
+ rec->width = 20;
+ rec->fontname = xstrdup("Arial");
+ FindIconByName(opt_symbol, &rec->guid);
+ rec->fontsize = 10;
+ rec->visible_zoom = opt_zoom?opt_zoom_num:10;
+ rec->unk6_1 = 1;
+ }
+ xfree(rec->name);
+ rec->name = xstrdup(wpt->description);
+
+ if (!nogc && wpt->gc_data->id) {
+ // FIXME: this whole mess should be qstring concatenation
+ auto* extra = (char*) xmalloc(25 + wpt->gc_data->placer.length() + wpt->shortname.length());
+ sprintf(extra, "\r\nBy %s\r\n%s (%1.1f/%1.1f)",
+ CSTR(wpt->gc_data->placer),
+ CSTRc(wpt->shortname), wpt->gc_data->diff/10.0,
+ wpt->gc_data->terr/10.0);
+ rec->name = xstrappend(rec->name, extra);
+ xfree(extra);
+ }
+
+ if (!nourl && wpt->HasUrlLink()) {
+ UrlLink l = wpt->GetUrlLink();
+ int len = 7 + l.url_.length();
+ auto* extra = (char*)xmalloc(len);
+ sprintf(extra, "{URL=%s}", CSTR(l.url_));
+ rec->name = xstrappend(rec->name, extra);
+ xfree(extra);
+ if (rec->url) {
+ xfree(rec->url);
+ }
+ rec->url = xstrdup(l.url_);
+ }
+ if (!wpt->notes.isEmpty()) {
+ if (rec->comment) {
+ xfree(rec->comment);
+ }
+ rec->comment = xstrdup(wpt->notes);
+ }
+
+
+ rec->creation_time = rec->modification_time = wpt->GetCreationTime().toTime_t();
+ rec->lat = EncodeOrd(wpt->latitude);
+ rec->lon = EncodeOrd(-wpt->longitude);
+ rec->serial = serial++;
+
+ if (rec->type == 0x12) { /* image */
+ if (wpt->icon_descr.contains(":\\")) {
+ rec->image_name = xstrdup(wpt->icon_descr);
+ rec->height = -244;
+ rec->width = -1;
+ }
+ }
+ if (!rec->image_name && !wpt->icon_descr.isNull()) {
+ FindIconByName(CSTR(wpt->icon_descr), &rec->guid);
+ }
+
+ Write_AN1_Waypoint(outfile, rec);
+ delete rec;
+}
+
+static void Write_AN1_Waypoints(gbfile* f)
+{
+ WriteShort(f, 2);
+ WriteLong(f, waypt_count());
+ waypt_disp_all(Write_One_AN1_Waypoint);
+}
+
+static void Read_AN1_Lines(gbfile* f)
+{
+ ReadShort(f);
+ unsigned long count = ReadLong(f);
+ for (unsigned long i = 0; i < count; i++) {
+ auto* rec = new an1_line_record;
+ Read_AN1_Line(f, rec);
+ /* create route rec */
+ auto* rte_head = new route_head;
+ rte_head->line_color.bbggrr = rec->linecolor;
+ if (rec->opacity == 0x8200) {
+ rte_head->line_color.opacity = 128;
+ }
+ // lineweight isn't set for dashed/dotted lines
+ // Since we don't have a way to represent this internally yet,
+ // use leave line_width at the default.
+ if (rec->lineweight) {
+ rte_head->line_width = rec->lineweight;
+ }
+ rte_head->rte_name = rec->name;
+ rte_head->fs.FsChainAdd(rec);
+ route_add_head(rte_head);
+ for (unsigned long j = 0; j < (unsigned) rec->pointcount; j++) {
+ auto* vert = new an1_vertex_record;
+ Read_AN1_Vertex(f, vert);
+
+ /* create route point */
+ auto* wpt_tmp = new Waypoint;
+ wpt_tmp->latitude = DecodeOrd(vert->lat);
+ wpt_tmp->longitude = -DecodeOrd(vert->lon);
+ wpt_tmp->shortname = QString::asprintf("\\%5.5lx", rtserial++);
+ wpt_tmp->fs.FsChainAdd(vert);
+ route_add_wpt(rte_head, wpt_tmp);
+ }
+ }
+}
+
+static void
+Make_Road_Changes(an1_line_record* rec)
+{
+ int i = 0;
+
+ if (!rec) {
+ return;
+ }
+
+ if (!roadchanges) {
+ return;
+ }
+
+ while (roadchanges[i].name) {
+ if (!case_ignore_strcmp(roadchanges[i].name, rec->name)) {
+ rec->roadtype = roadchanges[i].type;
+ break;
+ }
+ i++;
+ }
+}
+
+static void
+Write_One_AN1_Line(const route_head* rte)
+{
+ an1_line_record* rec;
+
+ const auto* source_rec = reinterpret_cast<an1_line_record*>(rte->fs.FsChainFind(kFsAn1L));
+
+ if (source_rec != nullptr) {
+ rec = source_rec->clone();
+ switch (output_type_num) {
+ case 1:
+ if (rec->type != 14) {
+ rec->roadtype = 0x11100541;
+ rec->unk2 = 655360;
+ rec->type = 14;
+ rec->unk8 = 2;
+ } // end if
+ Make_Road_Changes(rec);
+ break;
+ case 2:
+ if (rec->type != 15) {
+ rec->type = 15;
+ } // end if
+ break;
+ case 4:
+ if (rec->type != 16) {
+ rec->type = 16;
+ } // end if
+ break;
+ }
+ } else {
+ rec = new an1_line_record;
+ rec->name = nullptr;
+ switch (output_type_num) {
+ /* drawing road trail waypoint track */
+ case 1: /* road */
+ rec->roadtype = 0x11100541;
+ rec->unk2 = 655360;
+ rec->type = 14;
+ rec->unk8 = 2;
+ rec->name = xstrdup(rte->rte_name);
+ break;
+
+ case 2: /* trail */
+ rec->roadtype = 0x11071c50;
+ rec->unk2 = 917504;
+ rec->type = 15;
+ rec->unk8 = 2;
+ break;
+
+ case 4: /* track */
+ rec->roadtype = 0x48800015;
+ rec->unk2 = 917504;
+ rec->type = 16;
+ rec->unk4 = 2;
+ rec->unk8 = 2;
+ break;
+
+ case 0: /* drawing */
+ case 3: /* waypoint - shouldn't have lines */
+ default:
+ rec->roadtype = 0x48800015;
+ rec->unk2 = 1048576;
+ rec->type = 2;
+ rec->unk4 = 2;
+ rec->lineweight = 6;
+ rec->linecolor = opt_color_num; /* red */
+ rec->opacity = 3;
+ rec->unk8 = 2;
+ break;
+ }
+ if (!rec->name) {
+ rec->name = xstrdup("");
+ }
+
+ }
+ rec->serial = serial++;
+ rec->pointcount = rte->rte_waypt_ct;
+ Write_AN1_Line(outfile, rec);
+ delete rec;
+}
+
+static void
+Write_One_AN1_Vertex(const Waypoint* wpt)
+{
+ an1_vertex_record* rec;
+
+ const auto* source_rec = reinterpret_cast<an1_vertex_record*>(wpt->fs.FsChainFind(kFsAn1V));
+
+ if (source_rec != nullptr) {
+ rec = source_rec->clone();
+ } else {
+ rec = new an1_vertex_record;
+ rec->magic = 1;
+ }
+ rec->lat = EncodeOrd(wpt->latitude);
+ rec->lon = EncodeOrd(-wpt->longitude);
+
+ Write_AN1_Vertex(outfile, rec);
+ delete rec;
+}
+
+static void Write_AN1_Lines(gbfile* f)
+{
+ WriteShort(f, 2);
+ WriteLong(f, route_count()+track_count());
+
+ route_disp_all(Write_One_AN1_Line, nullptr, Write_One_AN1_Vertex);
+ track_disp_all(Write_One_AN1_Line, nullptr, Write_One_AN1_Vertex);
+}
+
+static void
+Init_Wpt_Type()
+{
+ if (!opt_wpt_type || !opt_wpt_type[0]) {
+ wpt_type_num = 1; /* marker */
+ return;
+ }
+ if ((opt_wpt_type[0] & 0xf0) == 0x30) {
+ wpt_type_num = atoi(opt_wpt_type);
+ } else {
+ wpt_type_num = 1; /* marker */
+ if (!case_ignore_strcmp(opt_wpt_type, "marker")) {
+ wpt_type_num = 1;
+ } else if (!case_ignore_strcmp(opt_wpt_type, "symbol")) {
+ wpt_type_num = 1; /* symbol and marker are synonyms */
+ } else if (!case_ignore_strcmp(opt_wpt_type, "text")) {
+ wpt_type_num = 4;
+ } else if (!case_ignore_strcmp(opt_wpt_type, "mapnote")) {
+ wpt_type_num = 6;
+ } else if (!case_ignore_strcmp(opt_wpt_type, "circle")) {
+ wpt_type_num = 5;
+ } else if (!case_ignore_strcmp(opt_wpt_type, "image")) {
+ wpt_type_num = 18;
+ } else {
+ fatal(MYNAME ": wpt_type must be "
+ "symbol, text, mapnote, circle, or image\n");
+ }
+ }
+}
+
+static void
+Init_Output_Type()
+{
+ if (!output_type || !output_type[0]) {
+ output_type_num = last_read_type;
+ return;
+ }
+ if ((output_type[0] & 0xf0) == 0x30) {
+ output_type_num = atoi(output_type);
+ } else {
+ output_type_num = 0;
+ if (!case_ignore_strcmp(output_type, "drawing")) {
+ output_type_num = 0;
+ } else if (!case_ignore_strcmp(output_type, "road")) {
+ output_type_num = 1;
+ } else if (!case_ignore_strcmp(output_type, "trail")) {
+ output_type_num = 2;
+ } else if (!case_ignore_strcmp(output_type, "waypoint")) {
+ output_type_num = 3;
+ } else if (!case_ignore_strcmp(output_type, "track")) {
+ output_type_num = 4;
+ } else {
+ fatal(MYNAME ": type must be "
+ "drawing, road, trail, waypoint, or track\n");
+ }
+ }
+ last_read_type = output_type_num;
+}
+
+static long
+Parse_Change_Type(char* type)
+{
+ long retval = 0x11100541;
+
+ if (!case_ignore_strcmp(type, "limited")) {
+ retval = 0x11070430;
+ } else if (!case_ignore_strcmp(type, "toll")) {
+ retval = 0x11070470;
+ } else if (!case_ignore_strcmp(type, "us")) {
+ retval = 0x11070870;
+ } else if (!case_ignore_strcmp(type, "state")) {
+ retval = 0x11070c10;
+ } else if (!case_ignore_strcmp(type, "primary")) {
+ /* primary state/provincial routes */
+ retval = 0x11070840;
+ } else if (!case_ignore_strcmp(type, "major")) {
+ retval = 0x11070c30;
+ } else if (!case_ignore_strcmp(type, "local")) {
+ retval = 0x11071010;
+ } else if (!case_ignore_strcmp(type, "ramp")) {
+ retval = 0x11070cb0;
+ } else if (!case_ignore_strcmp(type, "ferry")) {
+ retval = 0x11070ca0;
+ } else if (!case_ignore_strcmp(type, "editable")) {
+ retval = 0x11100541;
+ } else {
+ fatal(MYNAME ": unknown road type for road changes\n");
+ }
+ return retval;
+}
+
+static void
+Free_Road_Changes()
+{
+ int i = 0;
+ if (roadchanges) {
+ while (roadchanges[i].name) {
+ xfree(roadchanges[i].name);
+ i++;
+ }
+ xfree(roadchanges);
+ }
+ roadchanges = nullptr;
+}
+
+static void
+Init_Road_Changes()
+{
+ int count = 0;
+ Free_Road_Changes();
+
+ if (!road_changes || !road_changes[0]) {
+ return;
+ }
+ char* bar = strchr(road_changes, '!');
+ while (bar) {
+ count++;
+ bar = strchr(bar+1, '!');
+ }
+ if (!(count&1)) {
+ fatal(MYNAME ": invalid format for road changes\n");
+ }
+ count = 1 + count / 2;
+ roadchanges = (roadchange*)xmalloc((count+1) * sizeof(roadchange));
+
+ roadchanges[count].type = 0;
+ roadchanges[count].name = nullptr;
+
+ char* copy = xstrdup(road_changes);
+ bar = copy;
+
+ while (count) {
+ count--;
+ char* name = bar;
+ bar = strchr(name, '!');
+ *bar = '\0';
+ bar++;
+ char* strType = bar;
+ bar = strchr(strType, '!');
+ if (bar) {
+ *bar = '\0';
+ bar++;
+ }
+ roadchanges[count].name = xstrdup(name);
+ roadchanges[count].type = Parse_Change_Type(strType);
+ }
+
+ xfree(copy);
+}
+
+static void
+rd_init(const QString& fname)
+{
+ infile = gbfopen_le(fname, "rb", MYNAME);
+}
+
+static void
+rd_deinit()
+{
+ gbfclose(infile);
+}
+
+static void
+my_read()
+{
+ Read_AN1_Header(infile);
+ Read_AN1_Bitmaps(infile);
+ Read_AN1_Waypoints(infile);
+ Read_AN1_Lines(infile);
+}
+
+static void
+wr_init(const QString& fname)
+{
+ outfile = gbfopen_le(fname, "wb", MYNAME);
+ Init_Output_Type();
+ Init_Road_Changes();
+ opt_color_num = color_to_bbggrr(opt_color);
+ Init_Wpt_Type();
+ if (opt_zoom) {
+ opt_zoom_num = atoi(opt_zoom);
+ }
+ radius = .1609344; /* 1/10 mi in kilometers */
+ if (opt_radius) {
+ radius = atof(opt_radius);
+ if (!strchr(opt_radius,'k') && !strchr(opt_radius,'K')) {
+ radius *= kKilometersPerMile;
+ }
+ }
+}
+
+static void
+wr_deinit()
+{
+ Free_Road_Changes();
+ gbfclose(outfile);
+}
+
+static void
+my_write()
+{
+ Write_AN1_Header(outfile);
+ Write_AN1_Bitmaps(outfile);
+ Write_AN1_Waypoints(outfile);
+ Write_AN1_Lines(outfile);
+}
+
+ff_vecs_t an1_vecs = {
+ ff_type_file,
+ {
+ (ff_cap)(ff_cap_read | ff_cap_write) /* waypoints */,
+ ff_cap_write /* tracks */,
+ (ff_cap)(ff_cap_read | ff_cap_write) /* routes */,
+ },
+ rd_init,
+ wr_init,
+ rd_deinit,
+ wr_deinit,
+ my_read,
+ my_write,
+ nullptr,
+ &an1_args,
+ CET_CHARSET_ASCII, 0 /* CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
--- /dev/null
+/*
+
+
+
+
+
+
+
+
+
+ THIS FILE IS AUTOMATICALLY GENERATED
+
+
+ Please change make-an1sym.pl and
+ regenerate it rather than changing
+ this file directly.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+*/
+
+/*
+ Read DeLorme drawing files (.an1) - supplemental (included by an1.c)
+
+ Copyright (C) 2005 Ron Parker and Robert Lipe.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+static struct defguid {
+ guid_t guid;
+ const char* name;
+} default_guids[] = {
+ { {0xb610bc70,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Hiker"
+ },
+ { {0xb610bc71,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Canoe"
+ },
+ { {0xb610bc72,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Kayak"
+ },
+ { {0xb610bc73,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Bike"
+ },
+ { {0xb610bc74,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Four wheeler"
+ },
+ { {0xb610bc75,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Jeep"
+ },
+ { {0xb610bc76,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Snowmobile"
+ },
+ { {0xb610bc78,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Rec Vehicle"
+ },
+ { {0xb610bc79,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Fire"
+ },
+ { {0xb610bc7a,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Fishing"
+ },
+ { {0xb610bc7b,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Tree"
+ },
+ { {0xb610bc7c,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Pine Tree"
+ },
+ { {0xb610bc7d,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Birch"
+ },
+ { {0xb610bc7e,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Deer"
+ },
+ { {0xb610bc7f,{0x377e, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Moose"
+ },
+ { {0x99d8c163,{0x7622, 0x11d5, 0xe8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Mud"
+ },
+ { {0x012dfac2,{0xade8, 0x11d5, 0x0fb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Tractor"
+ },
+ { {0x012dfac3,{0xade8, 0x11d5, 0x0fb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Combine Harvester"
+ },
+ { {0x012dfac7,{0xade8, 0x11d5, 0x0fb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Front-End Loader"
+ },
+ { {0xfd163780,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Power Shovel"
+ },
+ { {0xfd163781,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Road Grader"
+ },
+ { {0xfd163784,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Road Roller"
+ },
+ { {0xfd163787,{0xb10a, 0x11d5, 0x11b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Dump Truck"
+ },
+ { {0x5673d712,{0xb28d, 0x11d5, 0x13b3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Skid-Steer Loader"
+ },
+ { {0xb86045ac,{0x390f, 0x420f, 0x91a7}, {0x76, 0x2f, 0x48, 0xea, 0xe2, 0xd7}},
+ "Highway Sign"
+ },
+ { {0x1e129e95,{0x13b6, 0x48d8, 0x3fa3}, {0x9c, 0xc8, 0x20, 0x8e, 0x1d, 0x9d}},
+ "Orange Cone"
+ },
+ { {0xadee7d54,{0xf7c9, 0x4ab6, 0xfb93}, {0x99, 0xc3, 0xbc, 0x9d, 0x15, 0x47}},
+ "Barricade"
+ },
+ { {0xa170000f,{0x8bd8, 0x4574, 0x58ac}, {0x55, 0x41, 0x67, 0xef, 0x64, 0x62}},
+ "Flagger"
+ },
+ { {0xa425f90e,{0x6ab6, 0x4ca9, 0x8997}, {0xbf, 0xca, 0xe0, 0xc2, 0x2b, 0x53}},
+ "Construction Sign"
+ },
+ { {0x0805b240,{0x6b26, 0x4300, 0xebb1}, {0xea, 0x9b, 0xcf, 0x68, 0xc6, 0x18}},
+ "Construction Flasher"
+ },
+ { {0x56721a6c,{0x8e77, 0x4b62, 0x09aa}, {0xce, 0xdc, 0x69, 0x4a, 0x16, 0x05}},
+ "Transit"
+ },
+ { {0x623e1ee9,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Arrow Left"
+ },
+ { {0x623e1eea,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Arrow Right"
+ },
+ { {0x623e1eeb,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Arrow Up"
+ },
+ { {0x623e1eec,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Arrow Down"
+ },
+ { {0x623e1eed,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Arrow Up Left"
+ },
+ { {0x623e1eee,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Arrow Up Right"
+ },
+ { {0x623e1eef,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Arrow Down Left"
+ },
+ { {0x623e1ef0,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Arrow Down Right"
+ },
+ { {0x83f91421,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Arrow Left"
+ },
+ { {0x83f91422,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Arrow Right"
+ },
+ { {0x83f91423,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Arrow Up"
+ },
+ { {0x83f91424,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Arrow Down"
+ },
+ { {0x83f91425,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Arrow Up Left"
+ },
+ { {0x83f91426,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Arrow Up Right"
+ },
+ { {0x83f91427,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Arrow Down Left"
+ },
+ { {0x83f91428,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Arrow Down Right"
+ },
+ { {0x83f91429,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Large Arrow Left"
+ },
+ { {0x83f9142a,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Large Arrow Right"
+ },
+ { {0x83f9142b,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Large Arrow Up"
+ },
+ { {0x83f9142c,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Large Arrow Down"
+ },
+ { {0x83f9142d,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Large Arrow Down Right"
+ },
+ { {0x83f9142e,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Large Arrow Down Left"
+ },
+ { {0x83f9142f,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Large Arrow Up Left"
+ },
+ { {0x83f91430,{0x3772, 0x11d6, 0xaeb3}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Large Arrow Up Right"
+ },
+ { {0x8ff0aad1,{0xc53d, 0x4998, 0x7ebd}, {0x06, 0x60, 0x25, 0x6c, 0x4f, 0x6d}},
+ "Accommodation"
+ },
+ { {0xaf7bf199,{0x6a8b, 0x49fe, 0xae92}, {0xa3, 0x09, 0x7b, 0xb8, 0x81, 0x6a}},
+ "Australia"
+ },
+ { {0x6bbcc9d1,{0x6a19, 0x4c7b, 0xc6a2}, {0x3e, 0x17, 0x02, 0xd6, 0xee, 0x3a}},
+ "Blue Dome Cross"
+ },
+ { {0xfff920fe,{0xd780, 0x49d4, 0x1bad}, {0x55, 0x2e, 0xc7, 0xdf, 0xa2, 0xaa}},
+ "Green Dome Cross"
+ },
+ { {0x57e75924,{0xd6fa, 0x4666, 0x84bf}, {0x5b, 0x76, 0xa1, 0xd0, 0x14, 0x5f}},
+ "Business"
+ },
+ { {0xb09ef4a7,{0x95e4, 0x4e5e, 0x5e84}, {0xbe, 0x2b, 0x86, 0xdd, 0x50, 0x65}},
+ "Airplane"
+ },
+ { {0xf2833c22,{0x3592, 0x4a8a, 0x5693}, {0xee, 0x6c, 0x83, 0xb6, 0x3c, 0x19}},
+ "Amusement Recreation"
+ },
+ { {0x6f0317d6,{0x7fa3, 0x4dcc, 0x6187}, {0x7e, 0xca, 0xcb, 0x65, 0x49, 0x12}},
+ "Green Square"
+ },
+ { {0x18a6d3c0,{0x45cb, 0x4d19, 0xf5b9}, {0xc7, 0x9c, 0xbf, 0x8f, 0x6d, 0x46}},
+ "Red Triangle"
+ },
+ { {0x86e68ea7,{0xb9ab, 0x4bc8, 0xa1bf}, {0xc1, 0x22, 0x13, 0x97, 0x95, 0xe8}},
+ "Red Triangle and Green Square"
+ },
+ { {0x6afd74bf,{0x0ea5, 0x4680, 0xcd88}, {0x15, 0x87, 0x2f, 0x6c, 0xd2, 0xd8}},
+ "City 4"
+ },
+ { {0x49dfeb74,{0xbb09, 0x4df1, 0x5687}, {0xd8, 0xa0, 0xff, 0x36, 0x89, 0x3d}},
+ "White Square"
+ },
+ { {0x3eed62c6,{0xdab9, 0x42b0, 0xe4a3}, {0xd2, 0xf1, 0x7d, 0x54, 0xbf, 0x77}},
+ "White Triangle"
+ },
+ { {0x6b521940,{0x4492, 0x4c48, 0x58a0}, {0xfc, 0xd1, 0x1f, 0x5e, 0x0c, 0xea}},
+ "Red Black Diamond Flag"
+ },
+ { {0xbb8ebaa3,{0xac59, 0x4411, 0x9c94}, {0x30, 0xd4, 0xe1, 0x21, 0x25, 0x46}},
+ "Yellow Diamond Flag"
+ },
+ { {0x8e118862,{0xf6aa, 0x4b34, 0x2b82}, {0x8f, 0x3b, 0x5a, 0x2b, 0x59, 0xeb}},
+ "Small Pink Square"
+ },
+ { {0xd0ef64c2,{0xe319, 0x4876, 0x1b85}, {0x0e, 0x90, 0x50, 0x89, 0xb7, 0xc5}},
+ "Store"
+ },
+ { {0xa22b08fb,{0x6193, 0x4f5c, 0xdaa4}, {0xfa, 0xdf, 0xa7, 0x6e, 0x23, 0xe1}},
+ "Camping"
+ },
+ { {0x27f57c69,{0x575b, 0x4b56, 0x288c}, {0xe8, 0xe1, 0xc7, 0x05, 0x1f, 0x1f}},
+ "Green Diamond Flag"
+ },
+ { {0xe07abb38,{0x219f, 0x4b52, 0x868b}, {0x45, 0x0f, 0xbc, 0xc1, 0x4f, 0x6a}},
+ "Red Diamond Flag"
+ },
+ { {0x3a124ac9,{0x3973, 0x4e27, 0x4b82}, {0xa6, 0x3a, 0x94, 0x5c, 0xf8, 0xb3}},
+ "Red Green Diamond Flag"
+ },
+ { {0x64ed669b,{0x0db8, 0x4ec9, 0xd181}, {0x98, 0x50, 0xb3, 0x8b, 0x2f, 0x2e}},
+ "White Globe"
+ },
+ { {0x3cb10adc,{0xb090, 0x4960, 0x9f8a}, {0xec, 0xaf, 0x6c, 0xd7, 0xaa, 0x8b}},
+ "Yellow Globe"
+ },
+ { {0x2779347d,{0x17d4, 0x4021, 0xa6a8}, {0x51, 0x9a, 0xb6, 0xf8, 0x21, 0xff}},
+ ""
+ },
+ { {0x3ad63f7b,{0x4339, 0x427d, 0x5797}, {0xce, 0xa9, 0x96, 0x33, 0x8b, 0x3c}},
+ "Black Cross"
+ },
+ { {0x3e89481e,{0x35ff, 0x48b6, 0xc7ae}, {0xb0, 0x75, 0xf6, 0x43, 0xc4, 0xc7}},
+ "Church"
+ },
+ { {0x68622c10,{0x79b6, 0x466d, 0xa8a3}, {0x27, 0xc6, 0x25, 0x34, 0xfa, 0xa9}},
+ "Small Dark Green Square"
+ },
+ { {0x42c6a873,{0x2d0c, 0x46e7, 0x9989}, {0xdd, 0x86, 0x01, 0x6e, 0xa4, 0xc9}},
+ "Small Black Square"
+ },
+ { {0x50e3b06e,{0xbe81, 0x4b2c, 0x1f92}, {0x80, 0xa5, 0x72, 0x9b, 0x33, 0x05}},
+ "Danger"
+ },
+ { {0x369d0b22,{0xed07, 0x421f, 0x8780}, {0x33, 0x0e, 0xbd, 0x27, 0x4f, 0x3c}},
+ "Construction Business"
+ },
+ { {0x10603b6c,{0xb02e, 0x49ee, 0x60b9}, {0xed, 0x7e, 0x31, 0x16, 0x27, 0x89}},
+ "Airport"
+ },
+ { {0x8328aab7,{0xfe04, 0x46dc, 0x7bbf}, {0x29, 0x34, 0x30, 0xd3, 0x4d, 0xeb}},
+ "City 5"
+ },
+ { {0x96411287,{0xda33, 0x40e3, 0xaa9c}, {0x75, 0x83, 0x78, 0x2d, 0xa6, 0xf3}},
+ "USA"
+ },
+ { {0xb2f98627,{0x1211, 0x40e8, 0xb287}, {0x6d, 0x66, 0xfd, 0x15, 0x1e, 0xd4}},
+ "Diver Down"
+ },
+ { {0x3fce26d0,{0xfec6, 0x4f8b, 0x55a2}, {0x89, 0x3a, 0x8e, 0x59, 0x08, 0x0a}},
+ "Light Yellow Square"
+ },
+ { {0xb4b68597,{0x1aed, 0x4918, 0xd492}, {0x1f, 0xd1, 0x5e, 0xf2, 0x55, 0xc1}},
+ "Education Technology"
+ },
+ { {0x35d2e6a8,{0xda88, 0x4edb, 0x4b80}, {0x2b, 0x1b, 0xcf, 0xc0, 0xd4, 0x6d}},
+ "Computer"
+ },
+ { {0x4ddc4e96,{0x8d19, 0x4079, 0x4488}, {0xc0, 0x8f, 0x0f, 0x8e, 0xb5, 0xd7}},
+ "Amusement Recreation Red"
+ },
+ { {0x79f58929,{0x46c6, 0x4337, 0xc0b1}, {0xf0, 0x09, 0x55, 0xbb, 0x1f, 0xc3}},
+ "Telephone Red"
+ },
+ { {0x0083b377,{0xfb80, 0x4a83, 0x3593}, {0x56, 0xe5, 0xfe, 0xc4, 0xcd, 0x43}},
+ "Exit"
+ },
+ { {0x0c232891,{0xab4d, 0x440e, 0x7083}, {0x05, 0x63, 0x3a, 0xf5, 0x66, 0x11}},
+ "Exit with Services"
+ },
+ { {0xaf63e7c2,{0x03fa, 0x418e, 0xc68b}, {0x02, 0xb8, 0xf5, 0x61, 0xb6, 0x61}},
+ "Pizza"
+ },
+ { {0xd419c693,{0x39e6, 0x43db, 0xa1b8}, {0x7f, 0xcc, 0x2c, 0xb8, 0x51, 0x4a}},
+ "Financial Services"
+ },
+ { {0x70740a81,{0xe4ca, 0x4ac2, 0xa498}, {0x21, 0xc8, 0x5b, 0xc0, 0xb7, 0xae}},
+ "City 3"
+ },
+ { {0x9a582ff6,{0x34c4, 0x41c6, 0xf0a3}, {0x99, 0x69, 0x9d, 0xbe, 0x2e, 0x08}},
+ "Food Store"
+ },
+ { {0x3cd31689,{0x2f8f, 0x4fb0, 0xcb88}, {0x34, 0x84, 0xfc, 0x8b, 0x03, 0xe4}},
+ ""
+ },
+ { {0x952557a6,{0xe29e, 0x4512, 0x1184}, {0x1a, 0x3c, 0x9c, 0xd4, 0x83, 0x7d}},
+ ""
+ },
+ { {0x03dc278c,{0xe8ff, 0x46ac, 0x3daa}, {0x9f, 0xe9, 0x1e, 0xcf, 0x10, 0x35}},
+ "Driving Range"
+ },
+ { {0xacd28bab,{0x0ec0, 0x4393, 0xaf8b}, {0xbb, 0x5e, 0x74, 0xb3, 0x87, 0x12}},
+ "Golf Municipal"
+ },
+ { {0x984e7139,{0xeab8, 0x49f6, 0x55a0}, {0x8d, 0x51, 0xe6, 0xdd, 0xcc, 0xf4}},
+ "Golf Private"
+ },
+ { {0xec5828ab,{0x2a9d, 0x48f8, 0xd79b}, {0xc9, 0xc3, 0x30, 0x8e, 0xe4, 0xea}},
+ "Golf Public"
+ },
+ { {0xb0120d99,{0x683a, 0x4ecc, 0x129a}, {0x29, 0x94, 0x1f, 0x04, 0xae, 0x10}},
+ "Golf Resort"
+ },
+ { {0x2ce7685a,{0x6eaf, 0x4061, 0x29a5}, {0x87, 0x5e, 0xfa, 0x41, 0x75, 0x1a}},
+ "Golf Semi Private"
+ },
+ { {0x10397049,{0x9fc9, 0x4380, 0x5680}, {0x81, 0xd9, 0xe7, 0x43, 0x1f, 0x11}},
+ "Medical Service"
+ },
+ { {0x2fc28df6,{0xe806, 0x436e, 0xe0b9}, {0x46, 0x1d, 0xeb, 0xad, 0x56, 0x60}},
+ "Home Furnishings"
+ },
+ { {0x910313db,{0xafce, 0x4019, 0x1aa4}, {0xe6, 0x2c, 0xe6, 0xd1, 0xfd, 0xf7}},
+ "Industrial"
+ },
+ { {0x9e442c6e,{0xe12a, 0x4407, 0xd68a}, {0x1c, 0x5e, 0x19, 0xe7, 0xfe, 0x01}},
+ ""
+ },
+ { {0x37e2fe4a,{0xcd71, 0x413f, 0x0cad}, {0x81, 0xc5, 0x2c, 0xf4, 0x78, 0x79}},
+ ""
+ },
+ { {0x3c756e09,{0xb2dc, 0x48a6, 0x04a9}, {0x20, 0xb7, 0xc9, 0x9d, 0x14, 0x51}},
+ ""
+ },
+ { {0xa1245b1c,{0x156a, 0x48fc, 0x6f96}, {0xa5, 0xa3, 0x22, 0x54, 0x13, 0x97}},
+ "Manufacturing"
+ },
+ { {0x5bddbd7a,{0xf3cb, 0x454c, 0x06af}, {0x46, 0x1a, 0x68, 0xea, 0x60, 0x1a}},
+ "Note"
+ },
+ { {0xcb6777e1,{0xe0e0, 0x45ce, 0x309f}, {0x8d, 0x61, 0x7a, 0xd9, 0x89, 0xf5}},
+ "City"
+ },
+ { {0xbc168c08,{0x2b7f, 0x44be, 0x3883}, {0x81, 0x31, 0x4a, 0x09, 0xf5, 0x78}},
+ "Air Base"
+ },
+ { {0xa8857b0f,{0xfc3b, 0x4cd1, 0x9e91}, {0xf5, 0x3b, 0x21, 0xa8, 0x3b, 0xb9}},
+ "Battlefield"
+ },
+ { {0x06db55c1,{0xf687, 0x4840, 0x7c80}, {0x95, 0x58, 0x77, 0x8e, 0x5a, 0xdd}},
+ "Mining"
+ },
+ { {0xcc61b277,{0xa48c, 0x445a, 0xd9b9}, {0xe5, 0x91, 0x36, 0x18, 0x4e, 0x09}},
+ "Mountain"
+ },
+ { {0xfde13186,{0xb6cb, 0x4374, 0xc880}, {0x56, 0x99, 0xeb, 0x51, 0x68, 0x87}},
+ "Capital"
+ },
+ { {0xb14d90d1,{0xd943, 0x40ff, 0x9fb7}, {0x9b, 0x92, 0xd1, 0x23, 0xca, 0xef}},
+ "Route"
+ },
+ { {0x7eabc63f,{0x05d0, 0x4465, 0xb1b0}, {0x61, 0x2a, 0xf7, 0x4d, 0x0f, 0x4e}},
+ "Overnight"
+ },
+ { {0xac39d8b9,{0xfcdc, 0x4b50, 0x9ca6}, {0xea, 0x6c, 0x4b, 0xb5, 0x96, 0x0f}},
+ "Route End Active"
+ },
+ { {0xe1b9d86b,{0x95e6, 0x4bd8, 0xd880}, {0x7b, 0x6c, 0xc6, 0xd2, 0x00, 0x34}},
+ "Route End Inactive"
+ },
+ { {0x98712315,{0x7e1e, 0x4024, 0x8392}, {0xe3, 0xb8, 0x5a, 0x51, 0x45, 0xb4}},
+ "Fuel Stop"
+ },
+ { {0xe5ea5b38,{0x7b80, 0x4b42, 0x0aba}, {0x3d, 0x38, 0xf0, 0xe1, 0x17, 0x9a}},
+ "Route Start Active"
+ },
+ { {0x18fd0d49,{0x0a29, 0x433a, 0xd584}, {0xe5, 0xb7, 0x5b, 0xe8, 0x25, 0xbc}},
+ "Route Start Inactive"
+ },
+ { {0x2f52144b,{0x903e, 0x4dd9, 0x79af}, {0xe1, 0x66, 0x9b, 0xfc, 0xa9, 0xc1}},
+ "Route Stop Active"
+ },
+ { {0xfaf8d826,{0xd27d, 0x4316, 0x0e92}, {0xce, 0x8d, 0x85, 0x93, 0x4c, 0xf5}},
+ "Route Stop Inactive"
+ },
+ { {0xff44cae2,{0x707c, 0x4a1c, 0x43af}, {0x8b, 0xb6, 0xb1, 0x19, 0x9c, 0xf2}},
+ "Route Via"
+ },
+ { {0x5a50d59b,{0xc15b, 0x49c4, 0x9faa}, {0xc4, 0x1c, 0x4f, 0xe2, 0x95, 0x2a}},
+ "Radiation Green"
+ },
+ { {0x19556023,{0xb1e5, 0x4c9c, 0x49ba}, {0x08, 0x52, 0xa1, 0x24, 0x3d, 0x9f}},
+ "Radiation Red"
+ },
+ { {0xa54be251,{0x6688, 0x49fb, 0x60b3}, {0x89, 0x56, 0x37, 0x68, 0xc5, 0xb0}},
+ "Electricity"
+ },
+ { {0xd793ff0c,{0xfbe0, 0x4383, 0x3183}, {0xcf, 0x4f, 0x04, 0xb7, 0xee, 0x0a}},
+ "Personal Furnishings"
+ },
+ { {0x00f90733,{0x7ab5, 0x42cf, 0x468c}, {0xbf, 0x91, 0x27, 0xd3, 0xa8, 0x9c}},
+ "Personal Services"
+ },
+ { {0xea677f24,{0xbbe8, 0x4238, 0xee9c}, {0x6c, 0x0a, 0xec, 0x0e, 0x34, 0xf4}},
+ "Telephone Black"
+ },
+ { {0x2d8a05b5,{0x8baf, 0x4f28, 0xf58b}, {0xfb, 0x7f, 0x37, 0x34, 0x28, 0xa7}},
+ "Government Light"
+ },
+ { {0x40c64dfc,{0xc2d0, 0x4b0e, 0x6582}, {0x3f, 0x26, 0x9c, 0xcb, 0x6f, 0x1d}},
+ "Airport Red Square"
+ },
+ { {0xf27adb5d,{0x3629, 0x44c7, 0x95a2}, {0x25, 0x2c, 0x95, 0x24, 0x98, 0x2f}},
+ "Propeller Aircraft"
+ },
+ { {0x5a718e13,{0x3547, 0x42c5, 0x6d9d}, {0xb2, 0x82, 0xa5, 0x53, 0xbd, 0x3a}},
+ "Jet Aircraft"
+ },
+ { {0x0a471039,{0x2dfe, 0x447e, 0x54be}, {0xa3, 0x93, 0xae, 0x9a, 0xdd, 0xac}},
+ "Government"
+ },
+ { {0x4a59da2f,{0xe1c3, 0x42c3, 0x6ca1}, {0x06, 0xb9, 0x14, 0x1b, 0x89, 0x99}},
+ "USA Regional"
+ },
+ { {0xf16500a9,{0xa845, 0x4293, 0xae89}, {0x5c, 0x29, 0xbb, 0x0d, 0x06, 0xf7}},
+ "House 2"
+ },
+ { {0x7b05524d,{0xcb5a, 0x456f, 0x96b3}, {0x03, 0x61, 0x24, 0x54, 0x6a, 0x54}},
+ "Picnic"
+ },
+ { {0xb88ad7a1,{0xb94d, 0x42e8, 0x2b9d}, {0xf5, 0x4c, 0x2b, 0xff, 0x57, 0xdc}},
+ "Restaurant"
+ },
+ { {0xdc48a20a,{0x54a2, 0x4c61, 0x1fbe}, {0x02, 0x74, 0x5b, 0xe9, 0x18, 0x99}},
+ "Store 2"
+ },
+ { {0x6b5ab040,{0x96df, 0x46ae, 0xacb8}, {0xe4, 0x47, 0x66, 0x3f, 0xec, 0x9b}},
+ ""
+ },
+ { {0x153b2cff,{0x6232, 0x4294, 0xd59a}, {0xc5, 0xa0, 0x7b, 0xe0, 0x16, 0xeb}},
+ "Blue Star"
+ },
+ { {0xf276f6b3,{0x586a, 0x4bf8, 0x2f82}, {0xf2, 0x69, 0xe3, 0x76, 0x7e, 0xd5}},
+ ""
+ },
+ { {0x91d242c8,{0x0986, 0x4fad, 0x8286}, {0xec, 0x79, 0x79, 0xcd, 0xab, 0x02}},
+ "Running"
+ },
+ { {0x8b0078db,{0x6ee0, 0x4caa, 0xd3b5}, {0xfe, 0xe1, 0xc2, 0xbf, 0x94, 0x7d}},
+ "Transportation"
+ },
+ { {0x0599f6c9,{0x478e, 0x4f63, 0x78a5}, {0xed, 0x31, 0xb5, 0xae, 0xda, 0x89}},
+ "Fishing 2"
+ },
+ { {0x7389128c,{0x0e78, 0x4d5d, 0x4189}, {0xb8, 0xf3, 0xb5, 0xbd, 0x70, 0xb1}},
+ "Automotive"
+ },
+ { {0x0362b593,{0x3df6, 0x48ed, 0xc489}, {0x85, 0x13, 0xc1, 0xc0, 0xb9, 0x0d}},
+ "Cloudy"
+ },
+ { {0xf0717a94,{0xd048, 0x4770, 0x9bab}, {0x80, 0x09, 0xbd, 0x4b, 0x1e, 0x75}},
+ "Partly Cloudy"
+ },
+ { {0x14486bbc,{0xae6b, 0x44ea, 0xd6b9}, {0xbf, 0x9a, 0x39, 0x7a, 0x51, 0x6c}},
+ "Mostly Cloudy"
+ },
+ { {0x7a258c70,{0xabec, 0x4cff, 0x4983}, {0x84, 0xdc, 0x2f, 0x2e, 0xff, 0x28}},
+ "Hurricane"
+ },
+ { {0xeff260d4,{0x46d5, 0x4fb5, 0xc79c}, {0x5e, 0x06, 0xc8, 0xab, 0x7a, 0x2b}},
+ "Lightning"
+ },
+ { {0xc3d70220,{0x5154, 0x4766, 0xf0af}, {0xdf, 0x86, 0x74, 0x40, 0x5f, 0x8c}},
+ "Rain"
+ },
+ { {0xf2dfbc91,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Blue Flag"
+ },
+ { {0xf2dfbc92,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Dark Blue Flag"
+ },
+ { {0xf2dfbc93,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Brown Flag"
+ },
+ { {0xf2dfbc94,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Yellow Flag"
+ },
+ { {0xf2dfbc95,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Red Flag 2"
+ },
+ { {0xf2dfbc96,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Dark Red Flag"
+ },
+ { {0xf2dfbc97,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Dark Green Flag"
+ },
+ { {0xf2dfbc98,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Green Flag"
+ },
+ { {0xf2dfbc99,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Blue-Green Flag"
+ },
+ { {0xf2dfbc9a,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Light Blue Flag"
+ },
+ { {0x623e1ee1,{0xaf27, 0x100f, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Dark Blue Map Pin"
+ },
+ { {0xf2dfbc9d,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Blue Map Pin"
+ },
+ { {0xf2dfbc9e,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Yellow Map Pin"
+ },
+ { {0xf2dfbc9f,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Brown Map Pin"
+ },
+ { {0xf2dfbca0,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Red Map Pin"
+ },
+ { {0xf2dfbca1,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Dark Red Map Pin"
+ },
+ { {0xf2dfbca2,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Green Map Pin"
+ },
+ { {0xf2dfbca3,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Dark Green Map Pin"
+ },
+ { {0xf2dfbca4,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Gray Map Pin"
+ },
+ { {0xf2dfbca5,{0x7ae6, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Dark Gray Map Pin"
+ },
+ { {0xd1703de0,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Green Dot"
+ },
+ { {0xd1703de1,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Dark Green Dot"
+ },
+ { {0xd1703de2,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Blue Dot"
+ },
+ { {0xd1703de3,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Dark Blue Dot"
+ },
+ { {0xd1703de5,{0x5c45, 0x11d5, 0xb8ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Red Dot"
+ },
+ { {0x45c088e0,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Dark Red Dot"
+ },
+ { {0x45c088e1,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Yellow Dot"
+ },
+ { {0x45c088e2,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Brown Dot"
+ },
+ { {0x45c088e3,{0x672d, 0x11d5, 0xcbae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Light Blue Dot"
+ },
+ { {0xbde3a8a1,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Blue-Green Dot"
+ },
+ { {0xbde3a8a2,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Green Dot"
+ },
+ { {0xbde3a8a3,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Dark Green Dot"
+ },
+ { {0xbde3a8a4,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Blue Dot"
+ },
+ { {0xbde3a8a5,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Dark Blue Dot"
+ },
+ { {0xbde3a8a6,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Red Dot"
+ },
+ { {0xbde3a8a7,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Dark Red Dot"
+ },
+ { {0xbde3a8a8,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Yellow Dot"
+ },
+ { {0xbde3a8a9,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Brown Dot"
+ },
+ { {0xbde3a8aa,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Light Blue Dot"
+ },
+ { {0xbde3a8ab,{0x7aeb, 0x11d5, 0xf3ae}, {0x00, 0x01, 0x02, 0x31, 0x5f, 0xfd}},
+ "Small Blue-Green Dot"
+ },
+ { {0x623e1ee0,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Red Flag"
+ },
+ { {0x623e1ee1,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Map Pin"
+ },
+ { {0x623e1ee2,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Yellow Square"
+ },
+ { {0x623e1ee3,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Red X"
+ },
+ { {0x623e1ee4,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Blue Circle"
+ },
+ { {0x623e1ee5,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "House"
+ },
+ { {0x623e1ee7,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Triangle"
+ },
+ { {0x623e1ee8,{0xaf27, 0x11d3, 0x29bc}, {0x00, 0x50, 0x04, 0x02, 0xf5, 0x32}},
+ "Green Star"
+ },
+ { {0x9d277805,{0xe2f8, 0x4f43, 0x3f97}, {0x35, 0x0d, 0x40, 0xae, 0x5c, 0xd3}},
+ "Geocache"
+ },
+ { {0xcb8aad04,{0xcc2d, 0x47f2, 0x428a}, {0x80, 0xf7, 0xd6, 0x68, 0xed, 0x32}},
+ "Geocache Found"
+ },
+ { {0x7341c1f4,{0xdecd, 0x4d35, 0x45a5}, {0x52, 0x25, 0x5e, 0xbf, 0xe6, 0x51}},
+ "Tent"
+ },
+ { {0x835b84e2,{0xf10c, 0x45cb, 0x958f}, {0x18, 0x3a, 0xc2, 0x2a, 0xe5, 0x28}},
+ "Tipup Up"
+ },
+ { {0xce06fc92,{0xbb0c, 0x4ec1, 0xda93}, {0x64, 0x4a, 0x60, 0xbe, 0x40, 0x90}},
+ "Topup Down"
+ },
+};
+
+static int FindIconByName(const char* name, guid_t* guid)
+{
+ for (unsigned int i = 0; i < (sizeof(default_guids)/sizeof(struct defguid)); ++i) {
+ if (!case_ignore_strcmp(name, default_guids[i].name)) {
+ *guid = default_guids[i].guid;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+static int FindIconByGuid(const guid_t* guid, const char** name)
+{
+ for (unsigned int i = 0; i < (sizeof(default_guids)/sizeof(struct defguid)); ++i) {
+ /* don't compare any structure padding */
+ if ((guid->l == default_guids[i].guid.l) &&
+ memcmp(guid->s, default_guids[i].guid.s, sizeof(guid->s)) &&
+ memcmp(guid->c, default_guids[i].guid.c, sizeof(guid->c))) {
+ *name = default_guids[i].name;
+ return 1;
+ }
+ }
+ return 0;
+}
--- /dev/null
+/*
+ Read Netstumbler data files.
+
+ Copyright (C) 2004-2020 Robert Lipe, robertlipe+source@gpsbabel.org and
+ John Temples; gpsns@xargs.com
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ */
+
+#include <QtCore/QDate> // for QDate
+#include <QtCore/QDateTime> // for QDateTime
+#include <QtCore/QString> // for QString
+#include <QtCore/QTime> // for QTime
+#include <QtCore/QVector> // for QVector
+#include <QtCore/Qt> // for UTC
+#include <cctype> // for isspace
+#include <cstdio> // for snprintf
+#include <cstdlib> // for atof, atoi, qsort, strtol
+#include <cstring> // for strcpy, strlen, strncmp, strstr
+#include "cet_util.h" // for cet_convert_init
+#include "csv_util.h" // for csv_lineparse
+#include "defs.h" // for arglist_t, Waypoint, ff_cap, WaypointList, ff_cap_none, ddmm2degrees, ARG_NOMINMAX, ARGTYPE_STRING, ff_cap_read, get_crc32, lrtrim, waypt_add, xfree, xmalloc, ff_type_file, ARGTYPE_BOOL, CET_CHARSET_ASCII, CET_CHARSET_UTF8, CSTR, NULL_POS_OPS, ff_vecs_t
+#include "gbfile.h" // for gbfclose, gbfgetstr, gbfopen, gbfile
+
+static gbfile* file_in;
+static char* nseicon = nullptr;
+static char* nsneicon = nullptr;
+static char* seicon = nullptr;
+static char* sneicon = nullptr;
+static char* snmac = nullptr;
+static int macstumbler;
+
+static void fix_netstumbler_dupes(const WaypointList*);
+
+#define MYNAME "NETSTUMBLER"
+
+static
+QVector<arglist_t> netstumbler_args = {
+ {
+ "nseicon", &nseicon, "Non-stealth encrypted icon name",
+ "Red Square", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "nsneicon", &nsneicon, "Non-stealth non-encrypted icon name",
+ "Green Square", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "seicon", &seicon, "Stealth encrypted icon name",
+ "Red Diamond", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "sneicon", &sneicon, "Stealth non-encrypted icon name",
+ "Green Diamond", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
+ },
+ {
+ "snmac", &snmac, "Shortname is MAC address", nullptr, ARGTYPE_BOOL,
+ ARG_NOMINMAX, nullptr
+ },
+};
+
+static void
+rd_init(const QString& fname)
+{
+ file_in = gbfopen(fname, "rb", MYNAME);
+ macstumbler = 0;
+}
+
+static void
+rd_deinit()
+{
+ gbfclose(file_in);
+}
+
+static void
+data_read()
+{
+ char* ibuf;
+ char ssid[2 + 32 + 2 + 1]; /* "( " + SSID + " )" + null */
+ char mac[2 + 17 + 2 + 1]; /* "( " + MAC + " )" + null */
+ QString desc;
+ double lat = 0, lon = 0;
+ int line_no = 0;
+ int stealth_num = 0, whitespace_num = 0;
+ long flags = 0;
+ int speed = 0, channel = 0;
+ int line = 0;
+ WaypointList tmp_waypt_list;
+ QDate date;
+ QTime time;
+
+ while ((ibuf = gbfgetstr(file_in))) {
+ int len;
+ int stealth = 0;
+
+
+ if ((line++ == 0) && file_in->unicode) {
+ cet_convert_init(CET_CHARSET_UTF8, 1);
+ }
+ ibuf = lrtrim(ibuf);
+ /* A sharp in column zero might be a comment. Or it might be
+ * something useful, like the date.
+ */
+
+ if (ibuf[0] == '#') {
+ if (strncmp(&ibuf[2], "$DateGMT:", 9) == 0) {
+ date = QDate::fromString(ibuf + 12, "yyyy-MM-dd");
+ }
+
+ /*
+ * Mac stumbler files are the same, except
+ * use DDMM.mmm instead of DD.DDDD.
+ */
+ if (strstr(ibuf, "Creator: MacStumbler")) {
+ macstumbler = 1;
+ }
+
+ continue;
+ }
+
+ int field_num = 0;
+ line_no++;
+ char* field = csv_lineparse(ibuf, "\t", "", line_no);
+
+ while (field) {
+ switch (field_num) {
+ case 0: /* lat */
+ lat = atof(&field[2]);
+ if (field[0] == 'S') {
+ lat = -lat;
+ }
+ if (macstumbler) {
+ lat = ddmm2degrees(lat);
+ }
+ break;
+
+ case 1: /* long */
+ lon = atof(&field[2]);
+ if (field[0] == 'W') {
+ lon = -lon;
+ }
+ if (macstumbler) {
+ lon = ddmm2degrees(lon);
+ }
+ break;
+
+ case 2: /* ( SSID ) */
+ strcpy(ssid, &field[2]); /* zap "( " */
+ len = strlen(ssid) - 2;
+ ssid[len] = 0; /* zap " )" */
+ stealth = (len == 0);
+ /* don't alter SSID in snmac mode */
+ if (!snmac) {
+ int found = 0;
+ /* check for all whitespace */
+ for (int i = 0; i < len && !found; i++) {
+ if (!isspace(ssid[i])) {
+ found = 1;
+ }
+ }
+
+ if (!stealth && !found) {
+ snprintf(ssid, sizeof ssid, "Whitespace/%d", ++whitespace_num);
+ }
+ }
+ break;
+
+ case 4: /* ( MAC address ) */
+ strcpy(mac, &field[2]); /* zap "( " */
+ mac[strlen(mac) - 2] = 0;/* zap " )" */
+ break;
+
+ case 5: /* time */
+ time = QTime::fromString(field, "hh:mm:ss");
+ break;
+
+ case 8: /* flags */
+ flags = strtol(field, nullptr, 16);
+ break;
+
+ case 11: /* data rate */
+ speed = atoi(field) / 10;
+ break;
+
+ case 12: /* last channel */
+ channel = atoi(field);
+ break;
+
+ case 3: /* type */
+ case 6: /* SNR/sig/noise */
+ case 7: /* name */
+ case 9: /* channel bits */
+ case 10: /* beacon interval */
+ default:
+ break;
+ }
+
+ field_num++;
+ field = csv_lineparse(nullptr, "\t", "", line_no);
+ }
+
+ if (lat == 0 && lon == 0) { /* skip records with no GPS data */
+ continue;
+ }
+
+ auto* wpt_tmp = new Waypoint;
+
+ if (stealth) {
+ if (!snmac) {
+ snprintf(ssid, sizeof ssid, "Stealth/%d", ++stealth_num);
+ }
+
+ if (flags & 0x0010) { /* encrypted? */
+ wpt_tmp->icon_descr = seicon;
+ } else {
+ wpt_tmp->icon_descr = sneicon;
+ }
+ } else {
+ if (flags & 0x0010) { /* encrypted? */
+ wpt_tmp->icon_descr = nseicon;
+ } else {
+ wpt_tmp->icon_descr = nsneicon;
+ }
+ }
+
+ if (snmac) {
+ desc = QString("%1/%2 Mbps/Ch %3").arg(ssid).arg(speed).arg(channel);
+ wpt_tmp->shortname = (mac);
+ } else {
+ desc = QString("%1 Mbps/Ch %2/%3").arg(speed).arg(channel).arg(mac);
+ wpt_tmp->shortname = (ssid);
+ }
+
+ wpt_tmp->description = desc;
+ wpt_tmp->longitude = lon;
+ wpt_tmp->latitude = lat;
+ wpt_tmp->SetCreationTime(QDateTime(date, time, Qt::UTC));
+
+ tmp_waypt_list.waypt_add(wpt_tmp);
+ }
+
+ fix_netstumbler_dupes(&tmp_waypt_list);
+
+ for (Waypoint* wpt : tmp_waypt_list) {
+ waypt_add(wpt);
+ }
+}
+
+struct htable_t {
+ unsigned long crc;
+ Waypoint* wpt;
+};
+
+static
+int
+compare(const void* a, const void* b)
+{
+ unsigned long crc_a = ((const htable_t*)a)->crc;
+ unsigned long crc_b = ((const htable_t*)b)->crc;
+
+ /* we can't just return crc_a - crc_b because the return type is
+ * signed.
+ * */
+
+ if (crc_a < crc_b) {
+ return -1;
+ } else if (crc_a > crc_b) {
+ return 1;
+ } else {
+ /* CRCs are equal; we need to subsort on the description (which
+ * includes the MAC address) to guarantee the same ordering of
+ * the output for any qsort() implementation. this is strictly
+ * to make the testo script happy.
+ * */
+
+ Waypoint* wpt_a = ((const htable_t*)a)->wpt;
+ Waypoint* wpt_b = ((const htable_t*)b)->wpt;
+ return wpt_a->description.compare(wpt_b->description);
+ }
+}
+
+/* netstumbler data will have a lot of duplicate shortnames if the SSID
+ * is used as the shortname (the default). salvage the dupes by
+ * synthesizing a (hopefully) unique shortname.
+ * */
+
+static
+void
+fix_netstumbler_dupes(const WaypointList* waypt_list)
+{
+ int ct = waypt_list->count(), serial = 0;
+ unsigned long last_crc;
+
+ auto* htable = (htable_t*) xmalloc(ct * sizeof(htable_t));
+ htable_t* bh = htable;
+
+ int i = 0;
+ for (Waypoint* waypointp : *waypt_list) {
+ bh->wpt = waypointp;
+ QString snptr = bh->wpt->shortname;
+ QString tmp_sn = snptr.toLower();
+ bh->crc = get_crc32(CSTR(tmp_sn), tmp_sn.length());
+ i ++;
+ bh ++;
+ }
+
+ qsort(htable, ct, sizeof *htable, compare);
+
+ last_crc = htable[0].crc + 1; /* force mismatch */
+
+ for (i = 0, bh = htable; i < ct; i++, bh++) {
+ if (last_crc == bh->crc) {
+ bh->wpt->shortname += QString("/%1").arg(++serial);
+ } else {
+ last_crc = bh->crc;
+ }
+ }
+
+ xfree(htable);
+}
+
+ff_vecs_t netstumbler_vecs = {
+ ff_type_file,
+ { ff_cap_read, ff_cap_none, ff_cap_none },
+ rd_init,
+ nullptr,
+ rd_deinit,
+ nullptr,
+ data_read,
+ nullptr,
+ nullptr,
+ &netstumbler_args,
+ CET_CHARSET_ASCII, 0 /* CET-REVIEW */
+ , NULL_POS_OPS,
+ nullptr
+};
+++ /dev/null
-#!/usr/bin/perl
-
-=pod
-
- This script reads a DeLorme Street Atlas 2003 .an1 (drawing) file
- and prints various pertinent data from it. Anything with a variable
- name starting with "unk" or "magic" or "zero" is probably something
- we don't yet understand. Suggestions as to what some of these fields
- mean are welcome. The author disclaims any liability arising from
- the use of any information contained within this script.
-
- Copyright (C) 2005 Ronald L. Parker (babelan1perl@parkrrrr.com)
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-=cut
-
-# Convert a longword to a latitude or longitude
-sub decode {
- my $foo = shift;
-
- my $intermed = 0x80000000-$foo;
- my $deg = $intermed/(0x800000);
- sprintf( "%8.8x %8.8x %d %06.3f", $foo, $intermed, $deg, 60*($deg-int($deg)));
-}
-
-
-# read a data structure from the input file.
-sub shiftunpack {
-
- my $pattern = shift;
- my @result = unpack( $pattern, $file );
- my $str = pack( $pattern, @result );
- $file = substr( $file, length( $str ));
- @result;
-}
-
-sub skip_bytes {
- my $count = shift;
- $file = substr( $file, $count );
-}
-
-sub decodeGuid {
- ($a, $b, $c, $d, $e, $f, $g, $h, $i, $j) = unpack( 'LSSSCCCCCC', shift );
- sprintf( '%8.8x-%4.4x-%4.4x-%4.4x-%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x',$a, $b, $c, $d, $e, $f, $g, $h, $i, $j);
-}
-
-# read file
-undef $/;
-$file = <>;
-
-@filetypes = qw( drawing road trail waypoint track );
-
-# read file header
-($magic, $filetype ) = shiftunpack( 'ss' );
-
-print <<END;
-MAGIC $magic
-$filetypes[$filetype] layer
-
-END
-
-# read bitmap info
-($bitmapcount) = shiftunpack( 'l' );
-
-while ( $bitmapcount ) {
- ($rec_type) = shiftunpack( 's' );
- if ( $rec_type == 0x4c49 ) { # 'IL'
- # This is a Windows ImageList stream. It actually includes the
- # 'BM' structures following in the stream, so we could be smarter
- # about how many we expect to find. (2 if bit 0 of ilflags is set,
- # 1 otherwise. That bit is ILC_MASK.) For now, though, this works
- # just fine. Newer versions of the IL structure supposedly contain
- # more overlay indices, but SA always seems to use the 0x101 version.
-
- # Documentation on the stream format is hard to come by. I found
- # mine in the form of the WINE project's reimplementation of comctl32r:
-
- # http://cvs.winehq.org/cvsweb/wine/dlls/comctl32/#dirlist
- # typedef struct _ILHEAD
- # {
- # USHORT usMagic; (RLP: this is 'IL', 0x4c49)
- # USHORT usVersion; (RLP: SA likes 0x0101)
- # WORD cCurImage; (RLP: image count)
- # WORD cMaxImage; (RLP: max before grow)
- # WORD cGrow;
- # WORD cx;
- # WORD cy;
- # COLORREF bkcolor; (RLP: DWORD, 0x00bbggrr)
- # WORD flags; (RLP: ILC_*; See below)
- # SHORT ovls[4];
- # } ILHEAD;
-
- # #define ILC_MASK 0x00000001
- # #define ILC_COLOR 0x00000000
- # #define ILC_COLORDDB 0x000000FE
- # #define ILC_COLOR4 0x00000004
- # #define ILC_COLOR8 0x00000008
- # #define ILC_COLOR16 0x00000010
- # #define ILC_COLOR24 0x00000018
- # #define ILC_COLOR32 0x00000020
- # See Windows SDK ImageList_Create for the meanings of these flags.
- # Street Atlas appears to use ILC_COLOR32, both with and without ILC_MASK.
-
- # * The format is like this:
- # * ILHEAD ilheadstruct;
- # *
- # * for the color image part:
- # * BITMAPFILEHEADER bmfh;
- # * BITMAPINFOHEADER bmih;
- # * only if it has a palette:
- # * RGBQUAD rgbs[nr_of_paletted_colors];
- # *
- # * BYTE colorbits[imagesize];
- # *
- # * the following only if the ILC_MASK bit is set in ILHEAD.ilFlags:
- # * BITMAPFILEHEADER bmfh_mask;
- # * BITMAPINFOHEADER bmih_mask;
- # * only if it has a palette (it usually does not):
- # * RGBQUAD rgbs[nr_of_paletted_colors];
- # *
- # * BYTE maskbits[imagesize];
- # *
- # * CAVEAT: Those images are within a NxM bitmap, not the 1xN we expect.
-
- ($ilVersion, $ilCount, $ilMax, $ilGrow, $ilcx, $ilcy,
- $ilbkColor, $ilflags, $ilovl1, $ilovl2, $ilovl3, $ilovl4 ) =
- shiftunpack( 'sssssslsssss' );
- printf( "ver %x count %d max %d grow %d cx %d cy %d bkcolor %x flags %x\n", $ilVersion, $ilCount, $ilMax, $ilGrow, $ilcx, $ilcy, $ilbkColor, $ilflags );
- }
- elsif ( $rec_type == 0x4d42 ) { # 'BM'
- # This is a standard BMP file, documented in MSDN.
- # BITMAPFILEHEADER
- ($fhsize, $res_0_1, $res_0_2, $bitoffset) = shiftunpack( 'lssl' );
- # BITMAPINFOHEADER
- ($bmisize, $width, $height, $planes, $bpp, $compression,
- $size, $xppm, $yppm, $colused, $colimprt ) = shiftunpack( 'lllssllllll');
- # palette
- $palettesize = $bitoffset - $bmisize - 14; # 14 bytes in BMFH, including the 'BM'
-
- open BMP, ">bitmap$filecount.bmp";
- binmode BMP;
- print BMP 'BM';
- $head = pack('lssl', ($fhsize, $res_0_1, $res_0_2, $bitoffset));
- print BMP $head;
- $head = pack('lllssllllll', ($bmisize, $width, $height, $planes, $bpp,
- $compression, $size, $xppm, $yppm, $colused, $colimprt));
- print BMP $head;
- print BMP substr($file, 0, $palettesize+$size);
- close BMP;
- $filecount++;
-
- skip_bytes( $palettesize );
- # image
- skip_bytes( $size );
- }
- else {
- # image information - the 'type' we read was actually the low word of the hotspot X coord.
- ($hotspotxhi, $hotspoty, $unk1, $guid, $name ) = shiftunpack( 'slla[16]C/a*' );
-
- # fix the hotspot X coord
- $hotspotx = $rec_type + 0x10000*$hotspotxhi;
-
- printf( "Image: %2d %2d %s %x $name\n", $hotspotx, $hotspoty, decodeGuid( $guid ), $unk1 );
- $imagenames{$guid} = $name;
- $bitmapcount--;
- }
-}
-
-# waypoint information
-
-($magic, $wptcount) = shiftunpack( 'sl' );
-
-@types = qw(none marker line polygon text circle mapnote highlight
- unknown8 arc spline rectangle unknown12 unknown13 road
- trail track waypoint photo);
-
-print( "$wptcount waypoints\n" );
-while ( $wptcount ) {
-
- ($magic, $unk1, $lon, $lat, $type, $height, $width, $unk2, $unk3, $serial,
- $unk4, $create_zoom, $visible_zoom, $unk5, $circle_radius, $name, $font,
- $guid, $fontcolor, $fontstyle, $fontsize, $outlineweight, $outlinecolor,
- $outlineflags, $fillcolor, $unk6, $fillflags ) =
- shiftunpack( 'slllsllssssCCsds/a*s/a*a[16]lllllllll' );
-
- # fontcolor is BGR (i.e. pure blue is 0xff00000, pure red is 0x0000ff)
- # fontstyle is 0x10-bold, 0x20-italic, 0x80-underline
-
- # width/height are in pixels for mapnotes and represent the offset of the
- # mapnote from the point (i.e. the dimensions of the tail.)
- # width/height are in degrees times 0x800000 for rectangles
-
- # circle_radius is in kilometers.
-
- # Note that type appears to be shared with lines.
- # type desc
- # 1 marker (flag, dot, etc.)
- # 4 text
- # 5 circle
- # 6 mapnote
- # 11 rectangle
- # 17 waypoint
- # 18 photo
-
-
-
- $lat = decode( $lat );
- $lon = decode( $lon );
-
- $rect_height = $height/0x800000;
- $rect_width = $width/0x800000;
-
- printf ( "$magic -- %x %x %x %x %x %x %x %x %x -- $type $types[$type] $lat $lon %s $imagenames{$guid} '$name'\n",
- $unk1, $unk2, $unk3, $unk4, $unk5, $unk6, decodeGuid( $guid ) );
-
- printf (" %d height %d width %x fill %x outline %x fillstyle font %s\n", $height, $width, $fillcolor, $outlinecolor, $fillflags, $font);
-
- $wptcount--;
-}
-
-# line information
-($magic, $linecount ) = shiftunpack( 'sl' );
-print ( "$linecount lines\n" );
-while ( $linecount ) {
- ($magic, $unk1, $serial, $unk2, $unk3, $type, $unk4, $name, $lineweight, $linestyle,
- $linecolor, $unk5, $polyfillcolor, $unk6, $unk7, $unk8, $pointcount ) =
- shiftunpack( 'ssslssls/a*sllllllsl' );
-
- # arcs are 4-point (3-segment) lines: start, third point, end, center (yes, that's overdetermined.)
-
- # Note that type appears to be shared with points.
- # type desc
- # 2 line
- # 3 polygon
- # 7 highlight
- # 9 arc
- # 10 spline
- # 14 routable road
- # 15 trail
- # 16 track
-
- printf ("--- start line --- %.4x %x %x %x %x %x %x %x %x -- $type $types[$type] '$name'\n", $magic,
- $unk1, $unk2, $unk3, $unk4, $unk5, $unk6, $unk7, $unk8 );
- while ( $pointcount ) {
- ($magic, $unk0, $lon, $lat, $unk0s ) = shiftunpack( 'sllls' );
- $lat = decode( $lat );
- $lon = decode( $lon );
- printf (" $magic $lat $lon %x %x\n", $unk0, $unk0s);
- $pointcount--;
- }
- print "--- end line ---\n";
- $linecount--;
-}
-
+++ /dev/null
-
-04xx Limited Access
-08xx Primary
-0Cxx Secondary
-10xx Local Road
-
-Axes:
- Toll/Limited/Primary/Secondary/Connecting/Local/-
- Interstate/US/State/County/Farm/Indian/Urban/Forest/Ranch/Ferry/Exit/Minor/-
- Unimproved/Under Construction/Approximation/-
-
-1107 ....
-
-0410 Primary Limited Access Limited - -
-0420 Primary Limited Access Toll Toll - -
-0430 Interstate Limited Interstate -
-0440 Interstate Toll Toll Interstate -
-0450 Interstate Under Construction Limited Interstate Const
-0460 State Route Primary Limited Access Limited State -
-0470 State Route Toll Toll State -
-0480 US Route Primary Limited Access Limited US -
-0490 US Route Toll Toll US -
-
-0810 Primary Non Limited Access Primary - -
-0820 Interstate Business Route Primary Interstate -
-0830 Primary Under Construction Primary - Const
-0840 State Route - State -
-0850 State Route Under Construction - State Const
-0860 State Route Primary Primary State -
-0870 US Route Primary US -
-0880 US Route Under Construction Primary US Const
-
-0C10 Secondary State Secondary State -
-0C20 Secondary Secondary - -
-0C30 Connecting Road Connecting - -
-0C40 County Route Connecting Road Connecting County -
-0C50 Farm Route Connecting Road Connecting Farm -
-0C60 Indian Route Connecting Road Connecting Indian -
-0C70 Urban Connecting Road Connecting Urban -
-0C80 Forest Connecting Road Connecting Forest -
-0C90 Ranch Route Connecting Road Connecting Ranch -
-0CA0 Ferry Crossing Connecting Road Connecting Ferry -
-0CB0 Exit COnnecting Road Connecting Exit -
-0CC0 Minor Connecting Road Connecting Minor -
-0CD0 Unimproved Connecting Road Connecting - Unimproved
-0CE0 Forest Secondary Road Secondary Forest -
-
-1010 Local or Rural Road Local - -
-1020 Local Road Approximation Local - Approx
-1030 Ferry Crossing Local Road Local Ferry -
-1040 Unimproved Local Road Local - Unimproved
-
+++ /dev/null
-/*
- Naviguide Routes
-
-
- Copyright (C) 2009 Erez Zuler
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-#include "defs.h"
-#include "csv_util.h"
-#include "jeeps/gpsmath.h"
-#include <QtCore/QDebug>
-#include <QtCore/QTextCodec>
-#include <cmath>
-
-#define MYNAME "Naviguide"
-
-
-/************* Specific Naviguide data formats ****************/
-
-/* Naviguide file header */
-struct ng_file_header_t {
- uint16_t nof_wp; /* Little endean format */
- unsigned char pad1[6]; /* 0xff, 0xff, 0x01, 0x00, 0x06, 0x00 */
- char signature[9]; /* cWaypoint */
- unsigned char pad2[4]; /* 0x01, 0x00, 0x00, 0x00 */
-};
-
-/* Naviguide waypoint/rout data */
-struct ng_wp_data_t {
- unsigned char pad1[8]; /* 0xfe, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00 */
- /* coordination are in old israeli grid */
- int32_t East;
- int32_t North;
- unsigned char pad2[2]; /* 0x01, 0x01 */
- uint32_t Alt;
- char CommentLength;
-};
-
-struct ng_next_wp_t {
- unsigned char pad1[2]; /* 0x01, 0x80 */
- uint16_t next_wp;
- unsigned char pad2[2]; /* 0x00, 0x00 */
-};
-
-struct ng_wp_no_comment_t {
- unsigned char chHeaderLen;
- char strName[255];
- ng_wp_data_t wp_data;
-};
-
-
-/* Global variables */
-
-static gbfile* file_in, *file_out;
-static uint16_t nof_wp;
-static route_head* rte_head;
-static ng_file_header_t ng_file_header;
-static ng_wp_no_comment_t WPNC;
-static ng_next_wp_t ng_next_wp;
-static char strComment[101];
-
-/* Process options */
-/* wp - process only waypoints */
-/* rte - process as route */
-/* wprte - Process waypoints and route */
-static char* process = nullptr;
-static char* reorder = nullptr;
-static int process_rte = 1;
-static int reorder_wp = 0;
-
-static char temp_short_name[5];
-
-
-
-
-/* Forward declarations */
-static void ng_read_file_header();
-
-static
-QVector<arglist_t> ng_args = {
- {
- "output", &process, "'wp' - Create waypoint file , 'rte' - Create route file",
- "rte", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "reorder", &reorder, "'n' - Keep the existing wp name, 'y' - rename waypoints",
- "n", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
-
-};
-
-/*===================Utilities ==========================================*/
-
-static void
-ng_convert_datum(Waypoint* wpt)
-{
- double lat, lon;
-
- auto east = (double) WPNC.wp_data.East;
- auto north = (double) WPNC.wp_data.North;
- auto alt = (double) WPNC.wp_data.Alt;
-
- GPS_Math_ICS_EN_To_WGS84(east, north, &lat, &lon);
- wpt->latitude = lat;
- wpt->longitude = lon;
- wpt->altitude = alt;
-}
-
-
-
-/*=================== File read/write utilities ==========================================*/
-
-static void
-ng_fwrite_wp_data(const QString& s, const QString& d, ng_wp_data_t* wp_data, gbfile* f)
-{
- char z[50];
-
- memset(z, 0, 50);
- int i = strlen(STRFROMUNICODE(s));
- gbfputc(i, f);
- gbfwrite(STRFROMUNICODE(s), 1, i, f);
-
- gbfwrite(&wp_data->pad1[0], 8, 1, f);
- gbfputint32(wp_data->East, f);
- gbfputint32(wp_data->North, f);
- gbfwrite(&wp_data->pad2[0], 2, 1, f);
- gbfputint32(wp_data->Alt, f);
-
- i = strlen(STRFROMUNICODE(d));
- gbfputc(i, f);
- gbfwrite(STRFROMUNICODE(d), 1, i, f);
- gbfwrite(z, 44, 1, f);
-}
-
-static void
-ng_fwrite_next_wp(ng_next_wp_t* nwp, gbfile* f)
-{
- gbfwrite(nwp->pad1, 2, 1, f);
- gbfputint16(nwp->next_wp, f);
- gbfwrite(nwp->pad2, 2, 1, f);
-}
-
-static void
-ng_fread_wp_data(char* d, ng_wp_no_comment_t* wpnc, gbfile* f)
-{
- gbfread(&wpnc->chHeaderLen ,sizeof(wpnc->chHeaderLen), 1, f);
- gbfread(&wpnc->strName, wpnc->chHeaderLen, 1, f);
- wpnc->strName[wpnc->chHeaderLen] = 0;
-
-
- gbfread(&wpnc->wp_data, 8, 1, f);
- wpnc->wp_data.East = gbfgetint32(f);
- wpnc->wp_data.North = gbfgetint32(f);
- gbfread(&wpnc->wp_data.pad2,2, 1, f);
- wpnc->wp_data.Alt = gbfgetint32(f);
- gbfread(&wpnc->wp_data.CommentLength, 1, 1, f);
- int i = (int)wpnc->wp_data.CommentLength;
-
-
- /* Read the comment field */
- gbfread(d, i + 44, 1, f);
-
-}
-
-static void
-ng_fread_next_wp(ng_next_wp_t* nwp, gbfile* f)
-{
- gbfread(&nwp->pad1, 2, 1, f);
- nwp->next_wp = gbfgetint16(f);
- gbfread(&nwp->pad2, 2, 1, f);
-}
-
-/* =================== Write data functions ====================================*/
-
-static void
-ng_fill_header_default()
-{
- ng_file_header_t default_header = {
- 0x00,
- {0xff, 0xff, 0x01, 0x00, 0x09, 0x00},
- {'C', 'W', 'a', 'y', 'P', 'o', 'i', 'n', 't'},
- {0x01, 0x00, 0x00, 0x00},
- };
-
- ng_file_header =default_header;
-
-}
-
-
-static void
-ng_fill_waypoint_default()
-{
- ng_wp_data_t default_wp = {
- {0xfe, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00},
- 0,
- 0,
- {0x01, 0x01},
- 0,
- 0x00,
-
- };
-
- ng_next_wp_t default_ng_next_wp = {
- {0x01, 0x80},
- 0,
- {0x00, 0x00},
- };
-
- WPNC.wp_data = default_wp;
- ng_next_wp = default_ng_next_wp;
-}
-
-
-static void
-ng_waypt_rd(const Waypoint* wpt)
-{
- char z[50];
- double lat, lon;
- static int current_wp_ix=0;
-
- memset(z, 0, 50);
- current_wp_ix++;
- ng_fill_waypoint_default();
-
- if (!GPS_Math_WGS84_To_ICS_EN(wpt->latitude, wpt->longitude, &lon, &lat)) {
- fatal(MYNAME ": Waypoint %d is out of the israeli grid area", current_wp_ix);
- }
-
- WPNC.wp_data.North = (int32_t)lat;
- WPNC.wp_data.East = (int32_t)lon;
-
- QString s;
- if (reorder_wp) {
- sprintf(temp_short_name, "A%03d", current_wp_ix);
- s = temp_short_name;
- }
-
- else {
- s = wpt->shortname;
- }
-
- ng_fwrite_wp_data(s, wpt->description, &WPNC.wp_data, file_out);
-
-
- /* if not Last WP, write the next one index */
-
- if (nof_wp > current_wp_ix) {
- ng_next_wp.next_wp = current_wp_ix + 1;
-
- ng_fwrite_next_wp(&ng_next_wp, file_out);
-
- }
-}
-
-static void
-header_write()
-{
- ng_file_header.nof_wp = nof_wp;
- gbfputint16(nof_wp, file_out);
- gbfwrite(&ng_file_header.pad1[0], 19, 1, file_out);
-
-}
-
-
-static void
-data_write()
-{
- nof_wp = waypt_count();
- if (nof_wp) {
- header_write();
- waypt_disp_all(ng_waypt_rd);
- } else {
- nof_wp = route_waypt_count();
- if (nof_wp) {
- header_write();
- route_disp_all(nullptr, nullptr, ng_waypt_rd);
- }
- }
-}
-
-
-static void
-wr_init(const QString& fname)
-{
- file_out = gbfopen_le(fname, "wb", MYNAME);
- ng_fill_header_default();
- if (nullptr != reorder)
- if (!case_ignore_strcmp(reorder, "y")) {
- reorder_wp = 1;
- }
-
-}
-
-static void
-wr_deinit()
-{
- gbfclose(file_out);
-}
-
-/*=========================== Read data functions ==================================*/
-
-static void
-rd_init(const QString& fname)
-{
- file_in = gbfopen_le(fname, "rb", MYNAME);
-
- ng_read_file_header();
-
- if (nullptr != process) {
- if (!case_ignore_strcmp(process, "wp")) {
- process_rte = 0;
- }
- if (!case_ignore_strcmp(process, "rte")) {
- process_rte = 1;
- }
- }
-
-
-}
-
-static void
-rd_deinit()
-{
- gbfclose(file_in);
- file_in = nullptr;
-}
-
-
-
-static void
-ng_read_file_header()
-{
-
- nof_wp = gbfgetint16(file_in);
- gbfread(&ng_file_header.pad1[0], 19, 1, file_in);
- ng_file_header.nof_wp = nof_wp;
-
-
- if (strncmp("CWayPoint", ng_file_header.signature, 9)) {
- fatal("\nInvalid Naviguide file format\n");
- }
-
-
-}
-
-static void
-data_read()
-{
- if (process_rte) {
- rte_head = new route_head;
- route_add_head(rte_head);
- }
-
- for (int n = 0; n < nof_wp; ++n) {
-
- auto* wpt_tmp = new Waypoint;
-
- /* Read waypoint data */
-
- ng_fread_wp_data(strComment, &WPNC, file_in);
-
-
- if (n < nof_wp - 1) {
- /*
- gbfread (&ng_next_wp.pad1[0], 2, 1, file_in);
- ng_next_wp.next_wp = gbfgetint16 (file_in);
- gbfread (&ng_next_wp.pad2[0], 2, 1, file_in);
- */
- ng_fread_next_wp(&ng_next_wp, file_in);
-
- }
- /* Clear commas form the comment for CSV file commonality */
- for (unsigned i = 0; i <strlen(strComment); ++i) {
- if (strComment[i] == ',') {
- strComment[i] = ' ';
- }
- }
-
- /* put the data in the waypoint structure */
- ng_convert_datum(wpt_tmp);
- wpt_tmp->shortname = STRTOUNICODE(WPNC.strName);
- wpt_tmp->description = STRTOUNICODE(strComment);
-
- if (process_rte) {
- route_add_wpt(rte_head, wpt_tmp);
- } else {
- waypt_add(wpt_tmp);
- }
- }
-} /* data_read */
-
-
-
-ff_vecs_t ng_vecs = {
- ff_type_file,
- FF_CAP_RW_WPT,
- rd_init,
- wr_init,
- rd_deinit,
- wr_deinit,
- data_read,
- data_write,
- nullptr,
- &ng_args,
- CET_CHARSET_HEBREW, 0
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-/*
- Read Netstumbler data files.
-
- Copyright (C) 2004-2020 Robert Lipe, robertlipe+source@gpsbabel.org and
- John Temples; gpsns@xargs.com
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
- */
-
-#include <QtCore/QDate> // for QDate
-#include <QtCore/QDateTime> // for QDateTime
-#include <QtCore/QString> // for QString
-#include <QtCore/QTime> // for QTime
-#include <QtCore/QVector> // for QVector
-#include <QtCore/Qt> // for UTC
-#include <cctype> // for isspace
-#include <cstdio> // for snprintf
-#include <cstdlib> // for atof, atoi, qsort, strtol
-#include <cstring> // for strcpy, strlen, strncmp, strstr
-#include "cet_util.h" // for cet_convert_init
-#include "csv_util.h" // for csv_lineparse
-#include "defs.h" // for arglist_t, Waypoint, ff_cap, WaypointList, ff_cap_none, ddmm2degrees, ARG_NOMINMAX, ARGTYPE_STRING, ff_cap_read, get_crc32, lrtrim, waypt_add, xfree, xmalloc, ff_type_file, ARGTYPE_BOOL, CET_CHARSET_ASCII, CET_CHARSET_UTF8, CSTR, NULL_POS_OPS, ff_vecs_t
-#include "gbfile.h" // for gbfclose, gbfgetstr, gbfopen, gbfile
-
-static gbfile* file_in;
-static char* nseicon = nullptr;
-static char* nsneicon = nullptr;
-static char* seicon = nullptr;
-static char* sneicon = nullptr;
-static char* snmac = nullptr;
-static int macstumbler;
-
-static void fix_netstumbler_dupes(const WaypointList*);
-
-#define MYNAME "NETSTUMBLER"
-
-static
-QVector<arglist_t> netstumbler_args = {
- {
- "nseicon", &nseicon, "Non-stealth encrypted icon name",
- "Red Square", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "nsneicon", &nsneicon, "Non-stealth non-encrypted icon name",
- "Green Square", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "seicon", &seicon, "Stealth encrypted icon name",
- "Red Diamond", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "sneicon", &sneicon, "Stealth non-encrypted icon name",
- "Green Diamond", ARGTYPE_STRING, ARG_NOMINMAX, nullptr
- },
- {
- "snmac", &snmac, "Shortname is MAC address", nullptr, ARGTYPE_BOOL,
- ARG_NOMINMAX, nullptr
- },
-};
-
-static void
-rd_init(const QString& fname)
-{
- file_in = gbfopen(fname, "rb", MYNAME);
- macstumbler = 0;
-}
-
-static void
-rd_deinit()
-{
- gbfclose(file_in);
-}
-
-static void
-data_read()
-{
- char* ibuf;
- char ssid[2 + 32 + 2 + 1]; /* "( " + SSID + " )" + null */
- char mac[2 + 17 + 2 + 1]; /* "( " + MAC + " )" + null */
- QString desc;
- double lat = 0, lon = 0;
- int line_no = 0;
- int stealth_num = 0, whitespace_num = 0;
- long flags = 0;
- int speed = 0, channel = 0;
- int line = 0;
- WaypointList tmp_waypt_list;
- QDate date;
- QTime time;
-
- while ((ibuf = gbfgetstr(file_in))) {
- int len;
- int stealth = 0;
-
-
- if ((line++ == 0) && file_in->unicode) {
- cet_convert_init(CET_CHARSET_UTF8, 1);
- }
- ibuf = lrtrim(ibuf);
- /* A sharp in column zero might be a comment. Or it might be
- * something useful, like the date.
- */
-
- if (ibuf[0] == '#') {
- if (strncmp(&ibuf[2], "$DateGMT:", 9) == 0) {
- date = QDate::fromString(ibuf + 12, "yyyy-MM-dd");
- }
-
- /*
- * Mac stumbler files are the same, except
- * use DDMM.mmm instead of DD.DDDD.
- */
- if (strstr(ibuf, "Creator: MacStumbler")) {
- macstumbler = 1;
- }
-
- continue;
- }
-
- int field_num = 0;
- line_no++;
- char* field = csv_lineparse(ibuf, "\t", "", line_no);
-
- while (field) {
- switch (field_num) {
- case 0: /* lat */
- lat = atof(&field[2]);
- if (field[0] == 'S') {
- lat = -lat;
- }
- if (macstumbler) {
- lat = ddmm2degrees(lat);
- }
- break;
-
- case 1: /* long */
- lon = atof(&field[2]);
- if (field[0] == 'W') {
- lon = -lon;
- }
- if (macstumbler) {
- lon = ddmm2degrees(lon);
- }
- break;
-
- case 2: /* ( SSID ) */
- strcpy(ssid, &field[2]); /* zap "( " */
- len = strlen(ssid) - 2;
- ssid[len] = 0; /* zap " )" */
- stealth = (len == 0);
- /* don't alter SSID in snmac mode */
- if (!snmac) {
- int found = 0;
- /* check for all whitespace */
- for (int i = 0; i < len && !found; i++) {
- if (!isspace(ssid[i])) {
- found = 1;
- }
- }
-
- if (!stealth && !found) {
- snprintf(ssid, sizeof ssid, "Whitespace/%d", ++whitespace_num);
- }
- }
- break;
-
- case 4: /* ( MAC address ) */
- strcpy(mac, &field[2]); /* zap "( " */
- mac[strlen(mac) - 2] = 0;/* zap " )" */
- break;
-
- case 5: /* time */
- time = QTime::fromString(field, "hh:mm:ss");
- break;
-
- case 8: /* flags */
- flags = strtol(field, nullptr, 16);
- break;
-
- case 11: /* data rate */
- speed = atoi(field) / 10;
- break;
-
- case 12: /* last channel */
- channel = atoi(field);
- break;
-
- case 3: /* type */
- case 6: /* SNR/sig/noise */
- case 7: /* name */
- case 9: /* channel bits */
- case 10: /* beacon interval */
- default:
- break;
- }
-
- field_num++;
- field = csv_lineparse(nullptr, "\t", "", line_no);
- }
-
- if (lat == 0 && lon == 0) { /* skip records with no GPS data */
- continue;
- }
-
- auto* wpt_tmp = new Waypoint;
-
- if (stealth) {
- if (!snmac) {
- snprintf(ssid, sizeof ssid, "Stealth/%d", ++stealth_num);
- }
-
- if (flags & 0x0010) { /* encrypted? */
- wpt_tmp->icon_descr = seicon;
- } else {
- wpt_tmp->icon_descr = sneicon;
- }
- } else {
- if (flags & 0x0010) { /* encrypted? */
- wpt_tmp->icon_descr = nseicon;
- } else {
- wpt_tmp->icon_descr = nsneicon;
- }
- }
-
- if (snmac) {
- desc = QString("%1/%2 Mbps/Ch %3").arg(ssid).arg(speed).arg(channel);
- wpt_tmp->shortname = (mac);
- } else {
- desc = QString("%1 Mbps/Ch %2/%3").arg(speed).arg(channel).arg(mac);
- wpt_tmp->shortname = (ssid);
- }
-
- wpt_tmp->description = desc;
- wpt_tmp->longitude = lon;
- wpt_tmp->latitude = lat;
- wpt_tmp->SetCreationTime(QDateTime(date, time, Qt::UTC));
-
- tmp_waypt_list.waypt_add(wpt_tmp);
- }
-
- fix_netstumbler_dupes(&tmp_waypt_list);
-
- for (Waypoint* wpt : tmp_waypt_list) {
- waypt_add(wpt);
- }
-}
-
-struct htable_t {
- unsigned long crc;
- Waypoint* wpt;
-};
-
-static
-int
-compare(const void* a, const void* b)
-{
- unsigned long crc_a = ((const htable_t*)a)->crc;
- unsigned long crc_b = ((const htable_t*)b)->crc;
-
- /* we can't just return crc_a - crc_b because the return type is
- * signed.
- * */
-
- if (crc_a < crc_b) {
- return -1;
- } else if (crc_a > crc_b) {
- return 1;
- } else {
- /* CRCs are equal; we need to subsort on the description (which
- * includes the MAC address) to guarantee the same ordering of
- * the output for any qsort() implementation. this is strictly
- * to make the testo script happy.
- * */
-
- Waypoint* wpt_a = ((const htable_t*)a)->wpt;
- Waypoint* wpt_b = ((const htable_t*)b)->wpt;
- return wpt_a->description.compare(wpt_b->description);
- }
-}
-
-/* netstumbler data will have a lot of duplicate shortnames if the SSID
- * is used as the shortname (the default). salvage the dupes by
- * synthesizing a (hopefully) unique shortname.
- * */
-
-static
-void
-fix_netstumbler_dupes(const WaypointList* waypt_list)
-{
- int ct = waypt_list->count(), serial = 0;
- unsigned long last_crc;
-
- auto* htable = (htable_t*) xmalloc(ct * sizeof(htable_t));
- htable_t* bh = htable;
-
- int i = 0;
- for (Waypoint* waypointp : *waypt_list) {
- bh->wpt = waypointp;
- QString snptr = bh->wpt->shortname;
- QString tmp_sn = snptr.toLower();
- bh->crc = get_crc32(CSTR(tmp_sn), tmp_sn.length());
- i ++;
- bh ++;
- }
-
- qsort(htable, ct, sizeof *htable, compare);
-
- last_crc = htable[0].crc + 1; /* force mismatch */
-
- for (i = 0, bh = htable; i < ct; i++, bh++) {
- if (last_crc == bh->crc) {
- bh->wpt->shortname += QString("/%1").arg(++serial);
- } else {
- last_crc = bh->crc;
- }
- }
-
- xfree(htable);
-}
-
-ff_vecs_t netstumbler_vecs = {
- ff_type_file,
- { ff_cap_read, ff_cap_none, ff_cap_none },
- rd_init,
- nullptr,
- rd_deinit,
- nullptr,
- data_read,
- nullptr,
- nullptr,
- &netstumbler_args,
- CET_CHARSET_ASCII, 0 /* CET-REVIEW */
- , NULL_POS_OPS,
- nullptr
-};
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="28.649722222" minlon="-17.973583333" maxlat="28.706111111" maxlon="-17.926500000"/>
- <trk>
- <name>FH-DRIVE</name>
- <trkseg>
- <trkpt lat="28.697833333" lon="-17.949000000">
- <ele>-4542.400</ele>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>654.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.949000000">
- <ele>656.000</ele>
- <speed>0.527778</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.949000000">
- <ele>657.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697805556" lon="-17.948972222">
- <ele>658.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697805556" lon="-17.949000000">
- <ele>658.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>661.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>659.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.949000000">
- <ele>660.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>656.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>657.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.949000000">
- <ele>656.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>655.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>658.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>657.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>656.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>659.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697805556" lon="-17.949000000">
- <ele>658.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697805556" lon="-17.949000000">
- <ele>660.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697805556" lon="-17.949000000">
- <ele>661.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.949000000">
- <ele>660.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.949000000">
- <ele>657.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>656.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>657.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.948972222">
- <ele>656.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697805556" lon="-17.949000000">
- <ele>656.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697805556" lon="-17.948972222">
- <ele>658.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697805556" lon="-17.949000000">
- <ele>657.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697833333" lon="-17.949027778">
- <ele>661.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697805556" lon="-17.949138889">
- <ele>659.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697750000" lon="-17.949333333">
- <ele>654.800</ele>
- <speed>2.000000</speed>
- </trkpt>
- <trkpt lat="28.697750000" lon="-17.949555556">
- <ele>650.200</ele>
- <speed>2.388889</speed>
- </trkpt>
- <trkpt lat="28.697638889" lon="-17.949527778">
- <ele>645.800</ele>
- <speed>1.888889</speed>
- </trkpt>
- <trkpt lat="28.697444444" lon="-17.949305556">
- <ele>642.600</ele>
- <speed>2.861111</speed>
- </trkpt>
- <trkpt lat="28.697138889" lon="-17.949138889">
- <ele>645.000</ele>
- <speed>3.194444</speed>
- </trkpt>
- <trkpt lat="28.696805556" lon="-17.948972222">
- <ele>647.400</ele>
- <speed>4.083333</speed>
- </trkpt>
- <trkpt lat="28.696527778" lon="-17.949027778">
- <ele>647.800</ele>
- <speed>3.805556</speed>
- </trkpt>
- <trkpt lat="28.696277778" lon="-17.949222222">
- <ele>646.600</ele>
- <speed>2.833333</speed>
- </trkpt>
- <trkpt lat="28.696333333" lon="-17.949444444">
- <ele>642.200</ele>
- <speed>3.055556</speed>
- </trkpt>
- <trkpt lat="28.696611111" lon="-17.949500000">
- <ele>637.800</ele>
- <speed>2.722222</speed>
- </trkpt>
- <trkpt lat="28.696805556" lon="-17.949638889">
- <ele>631.000</ele>
- <speed>2.944444</speed>
- </trkpt>
- <trkpt lat="28.696750000" lon="-17.950000000">
- <ele>625.000</ele>
- <speed>2.666667</speed>
- </trkpt>
- <trkpt lat="28.696750000" lon="-17.950194444">
- <ele>621.800</ele>
- <speed>3.333333</speed>
- </trkpt>
- <trkpt lat="28.696750000" lon="-17.950194444">
- <ele>618.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.696750000" lon="-17.950194444">
- <ele>615.600</ele>
- <speed>0.888889</speed>
- </trkpt>
- </trkseg>
- </trk>
- <trk>
- <name>30-12-05</name>
- <desc>PIRATENBUCH</desc>
- <number>1</number>
- <trkseg>
- <trkpt lat="28.697861111" lon="-17.949583333">
- <ele>-4542.400</ele>
- </trkpt>
- <trkpt lat="28.697944444" lon="-17.949555556">
- <ele>653.000</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.698027778" lon="-17.949555556">
- <ele>651.000</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.698083333" lon="-17.949527778">
- <ele>654.200</ele>
- <speed>1.138889</speed>
- </trkpt>
- <trkpt lat="28.698111111" lon="-17.949527778">
- <ele>650.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.698111111" lon="-17.949527778">
- <ele>648.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.698138889" lon="-17.949527778">
- <ele>651.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.698250000" lon="-17.949555556">
- <ele>649.800</ele>
- <speed>0.861111</speed>
- </trkpt>
- <trkpt lat="28.698333333" lon="-17.949638889">
- <ele>644.400</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.698416667" lon="-17.949694444">
- <ele>645.000</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.698500000" lon="-17.949694444">
- <ele>647.000</ele>
- <speed>0.972222</speed>
- </trkpt>
- <trkpt lat="28.698611111" lon="-17.949666667">
- <ele>645.600</ele>
- <speed>0.805556</speed>
- </trkpt>
- <trkpt lat="28.698694444" lon="-17.949694444">
- <ele>643.400</ele>
- <speed>1.138889</speed>
- </trkpt>
- <trkpt lat="28.698777778" lon="-17.949722222">
- <ele>639.800</ele>
- <speed>0.861111</speed>
- </trkpt>
- <trkpt lat="28.698861111" lon="-17.949750000">
- <ele>639.600</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.698861111" lon="-17.949777778">
- <ele>640.400</ele>
- <speed>0.666667</speed>
- </trkpt>
- <trkpt lat="28.698888889" lon="-17.949805556">
- <ele>647.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.698944444" lon="-17.949777778">
- <ele>649.400</ele>
- <speed>0.722222</speed>
- </trkpt>
- <trkpt lat="28.699027778" lon="-17.949722222">
- <ele>648.800</ele>
- <speed>1.722222</speed>
- </trkpt>
- <trkpt lat="28.699083333" lon="-17.949666667">
- <ele>646.200</ele>
- <speed>0.722222</speed>
- </trkpt>
- <trkpt lat="28.699083333" lon="-17.949694444">
- <ele>642.800</ele>
- <speed>0.555556</speed>
- </trkpt>
- <trkpt lat="28.699111111" lon="-17.949666667">
- <ele>639.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699166667" lon="-17.949611111">
- <ele>635.400</ele>
- <speed>0.777778</speed>
- </trkpt>
- <trkpt lat="28.699194444" lon="-17.949527778">
- <ele>631.400</ele>
- <speed>0.972222</speed>
- </trkpt>
- <trkpt lat="28.699250000" lon="-17.949416667">
- <ele>625.400</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.699277778" lon="-17.949361111">
- <ele>623.600</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.699277778" lon="-17.949361111">
- <ele>624.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699305556" lon="-17.949361111">
- <ele>624.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699277778" lon="-17.949361111">
- <ele>625.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699333333" lon="-17.949305556">
- <ele>625.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699333333" lon="-17.949361111">
- <ele>623.800</ele>
- <speed>0.694444</speed>
- </trkpt>
- <trkpt lat="28.699305556" lon="-17.949500000">
- <ele>626.000</ele>
- <speed>1.027778</speed>
- </trkpt>
- <trkpt lat="28.699361111" lon="-17.949638889">
- <ele>625.800</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.699416667" lon="-17.949750000">
- <ele>629.000</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.699416667" lon="-17.949777778">
- <ele>628.200</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.699444444" lon="-17.949916667">
- <ele>626.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699444444" lon="-17.949972222">
- <ele>625.800</ele>
- <speed>0.777778</speed>
- </trkpt>
- <trkpt lat="28.699500000" lon="-17.950027778">
- <ele>624.800</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.699555556" lon="-17.950138889">
- <ele>622.600</ele>
- <speed>0.555556</speed>
- </trkpt>
- <trkpt lat="28.699583333" lon="-17.950166667">
- <ele>621.400</ele>
- <speed>0.694444</speed>
- </trkpt>
- <trkpt lat="28.699666667" lon="-17.950222222">
- <ele>623.200</ele>
- <speed>0.666667</speed>
- </trkpt>
- <trkpt lat="28.699722222" lon="-17.950250000">
- <ele>623.000</ele>
- <speed>0.916667</speed>
- </trkpt>
- <trkpt lat="28.699833333" lon="-17.950250000">
- <ele>621.200</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.699916667" lon="-17.950277778">
- <ele>619.400</ele>
- <speed>0.944444</speed>
- </trkpt>
- <trkpt lat="28.699972222" lon="-17.950250000">
- <ele>621.000</ele>
- <speed>0.694444</speed>
- </trkpt>
- <trkpt lat="28.699944444" lon="-17.950277778">
- <ele>621.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699972222" lon="-17.950444444">
- <ele>622.200</ele>
- <speed>1.583333</speed>
- </trkpt>
- <trkpt lat="28.700027778" lon="-17.950527778">
- <ele>622.200</ele>
- <speed>1.583333</speed>
- </trkpt>
- <trkpt lat="28.700111111" lon="-17.950444444">
- <ele>625.400</ele>
- <speed>0.722222</speed>
- </trkpt>
- <trkpt lat="28.700138889" lon="-17.950388889">
- <ele>618.400</ele>
- <speed>0.638889</speed>
- </trkpt>
- <trkpt lat="28.700222222" lon="-17.950333333">
- <ele>617.200</ele>
- <speed>0.777778</speed>
- </trkpt>
- <trkpt lat="28.700305556" lon="-17.950277778">
- <ele>615.200</ele>
- <speed>0.888889</speed>
- </trkpt>
- <trkpt lat="28.700388889" lon="-17.950250000">
- <ele>616.200</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.700444444" lon="-17.950250000">
- <ele>616.000</ele>
- <speed>0.777778</speed>
- </trkpt>
- <trkpt lat="28.700527778" lon="-17.950222222">
- <ele>613.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700611111" lon="-17.950111111">
- <ele>609.200</ele>
- <speed>0.944444</speed>
- </trkpt>
- <trkpt lat="28.700666667" lon="-17.950083333">
- <ele>607.600</ele>
- <speed>1.277778</speed>
- </trkpt>
- <trkpt lat="28.700722222" lon="-17.950138889">
- <ele>604.800</ele>
- <speed>0.805556</speed>
- </trkpt>
- <trkpt lat="28.700750000" lon="-17.950166667">
- <ele>606.400</ele>
- <speed>1.000000</speed>
- </trkpt>
- <trkpt lat="28.700722222" lon="-17.950250000">
- <ele>609.600</ele>
- <speed>0.833333</speed>
- </trkpt>
- <trkpt lat="28.700722222" lon="-17.950333333">
- <ele>614.200</ele>
- <speed>0.750000</speed>
- </trkpt>
- <trkpt lat="28.700666667" lon="-17.950444444">
- <ele>618.800</ele>
- <speed>1.000000</speed>
- </trkpt>
- <trkpt lat="28.700638889" lon="-17.950527778">
- <ele>619.400</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.700638889" lon="-17.950583333">
- <ele>621.800</ele>
- <speed>1.138889</speed>
- </trkpt>
- <trkpt lat="28.700611111" lon="-17.950583333">
- <ele>623.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700583333" lon="-17.950694444">
- <ele>625.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700583333" lon="-17.950750000">
- <ele>629.600</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.700638889" lon="-17.950805556">
- <ele>628.600</ele>
- <speed>0.555556</speed>
- </trkpt>
- <trkpt lat="28.700666667" lon="-17.950833333">
- <ele>624.200</ele>
- <speed>0.916667</speed>
- </trkpt>
- <trkpt lat="28.700694444" lon="-17.950861111">
- <ele>625.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700694444" lon="-17.950833333">
- <ele>623.800</ele>
- <speed>0.583333</speed>
- </trkpt>
- <trkpt lat="28.700694444" lon="-17.950805556">
- <ele>607.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700722222" lon="-17.950861111">
- <ele>597.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700722222" lon="-17.950944444">
- <ele>613.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700777778" lon="-17.951000000">
- <ele>621.400</ele>
- <speed>0.777778</speed>
- </trkpt>
- <trkpt lat="28.700750000" lon="-17.951083333">
- <ele>618.600</ele>
- <speed>0.861111</speed>
- </trkpt>
- <trkpt lat="28.700805556" lon="-17.951166667">
- <ele>618.200</ele>
- <speed>0.805556</speed>
- </trkpt>
- <trkpt lat="28.700833333" lon="-17.951166667">
- <ele>615.800</ele>
- <speed>0.638889</speed>
- </trkpt>
- <trkpt lat="28.700861111" lon="-17.951194444">
- <ele>615.600</ele>
- <speed>0.833333</speed>
- </trkpt>
- <trkpt lat="28.700861111" lon="-17.951138889">
- <ele>614.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700861111" lon="-17.951138889">
- <ele>623.000</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.700861111" lon="-17.951138889">
- <ele>630.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700861111" lon="-17.951111111">
- <ele>626.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700861111" lon="-17.951111111">
- <ele>624.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700916667" lon="-17.951111111">
- <ele>627.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701027778" lon="-17.951138889">
- <ele>627.000</ele>
- <speed>1.027778</speed>
- </trkpt>
- <trkpt lat="28.701111111" lon="-17.951166667">
- <ele>625.200</ele>
- <speed>1.083333</speed>
- </trkpt>
- <trkpt lat="28.701138889" lon="-17.951166667">
- <ele>624.400</ele>
- <speed>0.972222</speed>
- </trkpt>
- <trkpt lat="28.701138889" lon="-17.951166667">
- <ele>624.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701111111" lon="-17.951166667">
- <ele>623.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701111111" lon="-17.951166667">
- <ele>621.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701111111" lon="-17.951138889">
- <ele>618.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701111111" lon="-17.951138889">
- <ele>614.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701194444" lon="-17.951111111">
- <ele>618.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701305556" lon="-17.951138889">
- <ele>621.200</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.701444444" lon="-17.951222222">
- <ele>624.000</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.701583333" lon="-17.951305556">
- <ele>623.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701750000" lon="-17.951361111">
- <ele>626.600</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.701916667" lon="-17.951416667">
- <ele>627.600</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.702055556" lon="-17.951472222">
- <ele>626.200</ele>
- <speed>0.916667</speed>
- </trkpt>
- <trkpt lat="28.702194444" lon="-17.951527778">
- <ele>626.000</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.702305556" lon="-17.951583333">
- <ele>628.800</ele>
- <speed>1.277778</speed>
- </trkpt>
- <trkpt lat="28.702416667" lon="-17.951611111">
- <ele>629.200</ele>
- <speed>1.222222</speed>
- </trkpt>
- <trkpt lat="28.702555556" lon="-17.951611111">
- <ele>629.200</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.702638889" lon="-17.951583333">
- <ele>628.200</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.702694444" lon="-17.951555556">
- <ele>627.400</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.702777778" lon="-17.951472222">
- <ele>626.600</ele>
- <speed>0.750000</speed>
- </trkpt>
- <trkpt lat="28.702861111" lon="-17.951388889">
- <ele>626.800</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.702944444" lon="-17.951277778">
- <ele>626.600</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.703055556" lon="-17.951222222">
- <ele>628.000</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.703166667" lon="-17.951222222">
- <ele>629.600</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.703277778" lon="-17.951277778">
- <ele>629.600</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.703361111" lon="-17.951388889">
- <ele>629.400</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.703388889" lon="-17.951500000">
- <ele>627.600</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.703416667" lon="-17.951638889">
- <ele>627.200</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.703444444" lon="-17.951777778">
- <ele>626.400</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.703472222" lon="-17.951916667">
- <ele>625.600</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.703500000" lon="-17.951972222">
- <ele>625.200</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.703500000" lon="-17.951916667">
- <ele>621.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.703500000" lon="-17.951944444">
- <ele>613.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.703527778" lon="-17.951972222">
- <ele>618.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.703138889" lon="-17.952277778">
- <ele>623.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.702888889" lon="-17.952722222">
- <ele>619.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.702666667" lon="-17.953194444">
- <ele>606.200</ele>
- <speed>1.444444</speed>
- </trkpt>
- <trkpt lat="28.702527778" lon="-17.953694444">
- <ele>596.000</ele>
- <speed>1.277778</speed>
- </trkpt>
- <trkpt lat="28.702500000" lon="-17.954000000">
- <ele>595.400</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.702166667" lon="-17.954361111">
- <ele>596.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701861111" lon="-17.954750000">
- <ele>591.200</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.701638889" lon="-17.955222222">
- <ele>572.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701305556" lon="-17.955583333">
- <ele>555.200</ele>
- <speed>0.611111</speed>
- </trkpt>
- <trkpt lat="28.701000000" lon="-17.955972222">
- <ele>550.800</ele>
- <speed>0.861111</speed>
- </trkpt>
- <trkpt lat="28.700611111" lon="-17.956250000">
- <ele>542.800</ele>
- <speed>0.805556</speed>
- </trkpt>
- <trkpt lat="28.700222222" lon="-17.956527778">
- <ele>545.000</ele>
- <speed>0.777778</speed>
- </trkpt>
- <trkpt lat="28.699861111" lon="-17.956861111">
- <ele>532.200</ele>
- <speed>0.694444</speed>
- </trkpt>
- <trkpt lat="28.699638889" lon="-17.957305556">
- <ele>521.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699666667" lon="-17.957833333">
- <ele>513.600</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.699777778" lon="-17.958333333">
- <ele>504.800</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.700111111" lon="-17.958694444">
- <ele>503.400</ele>
- <speed>1.555556</speed>
- </trkpt>
- <trkpt lat="28.700500000" lon="-17.958972222">
- <ele>501.000</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.700777778" lon="-17.959388889">
- <ele>501.000</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.700305556" lon="-17.959416667">
- <ele>495.400</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.699916667" lon="-17.959694444">
- <ele>487.000</ele>
- <speed>1.611111</speed>
- </trkpt>
- <trkpt lat="28.699611111" lon="-17.960083333">
- <ele>481.800</ele>
- <speed>1.472222</speed>
- </trkpt>
- <trkpt lat="28.699333333" lon="-17.960500000">
- <ele>475.200</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.698861111" lon="-17.960500000">
- <ele>475.200</ele>
- <speed>1.222222</speed>
- </trkpt>
- <trkpt lat="28.698500000" lon="-17.960805556">
- <ele>467.800</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.698777778" lon="-17.961222222">
- <ele>458.400</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.699222222" lon="-17.961361111">
- <ele>457.000</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.699694444" lon="-17.961416667">
- <ele>448.600</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.699638889" lon="-17.961944444">
- <ele>442.800</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.699527778" lon="-17.962444444">
- <ele>433.400</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.699527778" lon="-17.962972222">
- <ele>429.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699333333" lon="-17.963444444">
- <ele>424.800</ele>
- <speed>1.138889</speed>
- </trkpt>
- <trkpt lat="28.698944444" lon="-17.963722222">
- <ele>411.600</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.698527778" lon="-17.963944444">
- <ele>404.000</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.698111111" lon="-17.963750000">
- <ele>395.800</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.697694444" lon="-17.963500000">
- <ele>390.400</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.697277778" lon="-17.963750000">
- <ele>386.400</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.696888889" lon="-17.963472222">
- <ele>385.400</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.696666667" lon="-17.963000000">
- <ele>391.400</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.696555556" lon="-17.963500000">
- <ele>377.800</ele>
- <speed>1.527778</speed>
- </trkpt>
- <trkpt lat="28.696583333" lon="-17.964027778">
- <ele>370.600</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.696833333" lon="-17.964472222">
- <ele>371.000</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.697027778" lon="-17.964944444">
- <ele>363.800</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.697333333" lon="-17.965333333">
- <ele>356.200</ele>
- <speed>1.444444</speed>
- </trkpt>
- <trkpt lat="28.697694444" lon="-17.965694444">
- <ele>349.000</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.698027778" lon="-17.966055556">
- <ele>344.800</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.698111111" lon="-17.966583333">
- <ele>341.800</ele>
- <speed>0.777778</speed>
- </trkpt>
- <trkpt lat="28.698166667" lon="-17.967111111">
- <ele>336.000</ele>
- <speed>0.916667</speed>
- </trkpt>
- <trkpt lat="28.698361111" lon="-17.967583333">
- <ele>320.600</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.698500000" lon="-17.968083333">
- <ele>310.800</ele>
- <speed>1.083333</speed>
- </trkpt>
- <trkpt lat="28.698583333" lon="-17.968611111">
- <ele>299.200</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.698694444" lon="-17.968666667">
- <ele>290.400</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.698694444" lon="-17.968666667">
- <ele>284.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.698694444" lon="-17.968666667">
- <ele>283.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.698694444" lon="-17.968666667">
- <ele>283.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.698722222" lon="-17.968666667">
- <ele>281.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.698722222" lon="-17.968666667">
- <ele>276.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.698750000" lon="-17.968722222">
- <ele>277.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.698777778" lon="-17.968194444">
- <ele>292.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699027778" lon="-17.967750000">
- <ele>278.600</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.699138889" lon="-17.967805556">
- <ele>270.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699194444" lon="-17.968166667">
- <ele>252.200</ele>
- <speed>0.805556</speed>
- </trkpt>
- <trkpt lat="28.699416667" lon="-17.967833333">
- <ele>246.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699555556" lon="-17.967805556">
- <ele>223.400</ele>
- <speed>0.916667</speed>
- </trkpt>
- <trkpt lat="28.699638889" lon="-17.967972222">
- <ele>209.200</ele>
- <speed>0.555556</speed>
- </trkpt>
- <trkpt lat="28.699555556" lon="-17.968333333">
- <ele>177.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699722222" lon="-17.968277778">
- <ele>193.800</ele>
- <speed>0.638889</speed>
- </trkpt>
- <trkpt lat="28.699777778" lon="-17.968250000">
- <ele>181.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699805556" lon="-17.968305556">
- <ele>175.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699805556" lon="-17.968555556">
- <ele>179.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699916667" lon="-17.968805556">
- <ele>168.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699916667" lon="-17.969083333">
- <ele>155.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699861111" lon="-17.969277778">
- <ele>124.800</ele>
- <speed>0.694444</speed>
- </trkpt>
- <trkpt lat="28.699388889" lon="-17.969222222">
- <ele>126.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699861111" lon="-17.969277778">
- <ele>123.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700361111" lon="-17.969305556">
- <ele>125.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699972222" lon="-17.969388889">
- <ele>90.800</ele>
- <speed>1.000000</speed>
- </trkpt>
- <trkpt lat="28.699750000" lon="-17.969583333">
- <ele>101.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699833333" lon="-17.969916667">
- <ele>109.600</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.700055556" lon="-17.970027778">
- <ele>73.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700083333" lon="-17.970388889">
- <ele>66.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700250000" lon="-17.970194444">
- <ele>56.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700472222" lon="-17.970194444">
- <ele>44.800</ele>
- <speed>0.888889</speed>
- </trkpt>
- <trkpt lat="28.700722222" lon="-17.970638889">
- <ele>44.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700083333" lon="-17.971250000">
- <ele>22.800</ele>
- <speed>1.638889</speed>
- </trkpt>
- <trkpt lat="28.700555556" lon="-17.971194444">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700027778" lon="-17.971277778">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700583333" lon="-17.971333333">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701166667" lon="-17.971194444">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700722222" lon="-17.971055556">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700361111" lon="-17.971388889">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700500000" lon="-17.971416667">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700472222" lon="-17.971333333">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700583333" lon="-17.971333333">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700500000" lon="-17.971416667">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700444444" lon="-17.971361111">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700444444" lon="-17.971416667">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700555556" lon="-17.971361111">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700416667" lon="-17.971333333">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700583333" lon="-17.971305556">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700250000" lon="-17.971722222">
- <ele>24.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700416667" lon="-17.971444444">
- <ele>117.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700555556" lon="-17.971250000">
- <ele>54.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700472222" lon="-17.970500000">
- <ele>41.000</ele>
- <speed>0.916667</speed>
- </trkpt>
- <trkpt lat="28.700527778" lon="-17.969972222">
- <ele>45.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700638889" lon="-17.970027778">
- <ele>40.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700666667" lon="-17.970555556">
- <ele>45.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700944444" lon="-17.970777778">
- <ele>43.400</ele>
- <speed>0.916667</speed>
- </trkpt>
- <trkpt lat="28.701333333" lon="-17.970750000">
- <ele>49.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701388889" lon="-17.970333333">
- <ele>69.800</ele>
- <speed>0.750000</speed>
- </trkpt>
- <trkpt lat="28.701611111" lon="-17.970416667">
- <ele>101.800</ele>
- <speed>0.694444</speed>
- </trkpt>
- <trkpt lat="28.701750000" lon="-17.970472222">
- <ele>115.200</ele>
- <speed>0.694444</speed>
- </trkpt>
- <trkpt lat="28.701916667" lon="-17.970111111">
- <ele>125.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.702083333" lon="-17.970472222">
- <ele>148.800</ele>
- <speed>0.555556</speed>
- </trkpt>
- <trkpt lat="28.702250000" lon="-17.970666667">
- <ele>164.800</ele>
- <speed>0.722222</speed>
- </trkpt>
- <trkpt lat="28.702277778" lon="-17.970805556">
- <ele>177.000</ele>
- <speed>0.888889</speed>
- </trkpt>
- <trkpt lat="28.702000000" lon="-17.971222222">
- <ele>173.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.702444444" lon="-17.971305556">
- <ele>166.200</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.702861111" lon="-17.971500000">
- <ele>144.400</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.702388889" lon="-17.971555556">
- <ele>130.000</ele>
- <speed>1.222222</speed>
- </trkpt>
- <trkpt lat="28.702583333" lon="-17.972055556">
- <ele>131.600</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.703027778" lon="-17.972194444">
- <ele>112.600</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.703055556" lon="-17.972444444">
- <ele>101.200</ele>
- <speed>0.638889</speed>
- </trkpt>
- <trkpt lat="28.702750000" lon="-17.972833333">
- <ele>90.200</ele>
- <speed>0.805556</speed>
- </trkpt>
- <trkpt lat="28.702750000" lon="-17.973361111">
- <ele>72.600</ele>
- <speed>0.805556</speed>
- </trkpt>
- <trkpt lat="28.702666667" lon="-17.973583333">
- <ele>59.400</ele>
- <speed>1.138889</speed>
- </trkpt>
- <trkpt lat="28.703027778" lon="-17.973583333">
- <ele>41.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.703277778" lon="-17.973138889">
- <ele>14.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.703694444" lon="-17.972861111">
- <ele>8.800</ele>
- <speed>2.305556</speed>
- </trkpt>
- </trkseg>
- </trk>
- <trk>
- <name>1-1-06</name>
- <desc>TORRE TIME</desc>
- <number>2</number>
- <trkseg>
- <trkpt lat="28.697944444" lon="-17.949222222">
- <ele>-4542.400</ele>
- </trkpt>
- <trkpt lat="28.697916667" lon="-17.949250000">
- <ele>653.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697944444" lon="-17.949250000">
- <ele>657.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697944444" lon="-17.949222222">
- <ele>654.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.697750000" lon="-17.949500000">
- <ele>653.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.698194444" lon="-17.949638889">
- <ele>647.400</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.698638889" lon="-17.949750000">
- <ele>646.400</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.699111111" lon="-17.949750000">
- <ele>643.400</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.699361111" lon="-17.949277778">
- <ele>636.800</ele>
- <speed>0.833333</speed>
- </trkpt>
- <trkpt lat="28.699444444" lon="-17.949805556">
- <ele>621.800</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.699722222" lon="-17.950222222">
- <ele>619.800</ele>
- <speed>1.444444</speed>
- </trkpt>
- <trkpt lat="28.700138889" lon="-17.950416667">
- <ele>618.800</ele>
- <speed>0.638889</speed>
- </trkpt>
- <trkpt lat="28.700527778" lon="-17.950138889">
- <ele>618.600</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.700611111" lon="-17.950666667">
- <ele>615.200</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.700805556" lon="-17.951138889">
- <ele>615.000</ele>
- <speed>0.722222</speed>
- </trkpt>
- <trkpt lat="28.701277778" lon="-17.951111111">
- <ele>624.000</ele>
- <speed>0.611111</speed>
- </trkpt>
- <trkpt lat="28.701027778" lon="-17.950694444">
- <ele>623.400</ele>
- <speed>0.861111</speed>
- </trkpt>
- <trkpt lat="28.701250000" lon="-17.950222222">
- <ele>640.000</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.701472222" lon="-17.949750000">
- <ele>644.400</ele>
- <speed>0.944444</speed>
- </trkpt>
- <trkpt lat="28.701472222" lon="-17.949722222">
- <ele>652.000</ele>
- <speed>0.833333</speed>
- </trkpt>
- <trkpt lat="28.701527778" lon="-17.949611111">
- <ele>656.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701555556" lon="-17.949083333">
- <ele>655.400</ele>
- <speed>0.805556</speed>
- </trkpt>
- <trkpt lat="28.702027778" lon="-17.949027778">
- <ele>665.200</ele>
- <speed>0.888889</speed>
- </trkpt>
- <trkpt lat="28.701805556" lon="-17.948555556">
- <ele>677.800</ele>
- <speed>1.138889</speed>
- </trkpt>
- <trkpt lat="28.702055556" lon="-17.948111111">
- <ele>684.400</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.702305556" lon="-17.947638889">
- <ele>692.200</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.702388889" lon="-17.947111111">
- <ele>696.200</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.702583333" lon="-17.946611111">
- <ele>701.600</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.702777778" lon="-17.946138889">
- <ele>712.400</ele>
- <speed>1.027778</speed>
- </trkpt>
- <trkpt lat="28.703055556" lon="-17.945722222">
- <ele>717.400</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.702583333" lon="-17.945666667">
- <ele>718.400</ele>
- <speed>1.444444</speed>
- </trkpt>
- <trkpt lat="28.702166667" lon="-17.945861111">
- <ele>725.800</ele>
- <speed>0.694444</speed>
- </trkpt>
- <trkpt lat="28.702000000" lon="-17.945750000">
- <ele>752.000</ele>
- <speed>0.527778</speed>
- </trkpt>
- <trkpt lat="28.702472222" lon="-17.945722222">
- <ele>745.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.702916667" lon="-17.945583333">
- <ele>735.000</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.702805556" lon="-17.946083333">
- <ele>727.600</ele>
- <speed>1.222222</speed>
- </trkpt>
- <trkpt lat="28.702666667" lon="-17.946583333">
- <ele>726.400</ele>
- <speed>1.444444</speed>
- </trkpt>
- <trkpt lat="28.702972222" lon="-17.946194444">
- <ele>710.600</ele>
- <speed>0.500000</speed>
- </trkpt>
- <trkpt lat="28.703250000" lon="-17.945777778">
- <ele>727.400</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.703277778" lon="-17.945805556">
- <ele>738.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.703277778" lon="-17.945777778">
- <ele>735.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.703500000" lon="-17.945305556">
- <ele>738.800</ele>
- <speed>1.027778</speed>
- </trkpt>
- <trkpt lat="28.703694444" lon="-17.944833333">
- <ele>748.200</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.703944444" lon="-17.944388889">
- <ele>754.800</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.704027778" lon="-17.943861111">
- <ele>767.000</ele>
- <speed>0.972222</speed>
- </trkpt>
- <trkpt lat="28.704444444" lon="-17.943638889">
- <ele>774.000</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.704750000" lon="-17.943722222">
- <ele>780.600</ele>
- <speed>0.694444</speed>
- </trkpt>
- <trkpt lat="28.705111111" lon="-17.943583333">
- <ele>802.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.705416667" lon="-17.943194444">
- <ele>802.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.705694444" lon="-17.942777778">
- <ele>814.200</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.706111111" lon="-17.942527778">
- <ele>817.400</ele>
- <speed>1.000000</speed>
- </trkpt>
- <trkpt lat="28.705916667" lon="-17.942027778">
- <ele>826.600</ele>
- <speed>0.833333</speed>
- </trkpt>
- <trkpt lat="28.705472222" lon="-17.942111111">
- <ele>835.000</ele>
- <speed>1.277778</speed>
- </trkpt>
- <trkpt lat="28.705111111" lon="-17.942472222">
- <ele>841.400</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.705055556" lon="-17.941944444">
- <ele>846.200</ele>
- <speed>2.250000</speed>
- </trkpt>
- <trkpt lat="28.704972222" lon="-17.941416667">
- <ele>855.600</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.704972222" lon="-17.940888889">
- <ele>857.600</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.704916667" lon="-17.940361111">
- <ele>862.800</ele>
- <speed>1.222222</speed>
- </trkpt>
- <trkpt lat="28.704916667" lon="-17.939833333">
- <ele>871.000</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.705055556" lon="-17.939333333">
- <ele>883.800</ele>
- <speed>0.916667</speed>
- </trkpt>
- <trkpt lat="28.705111111" lon="-17.938805556">
- <ele>890.400</ele>
- <speed>0.722222</speed>
- </trkpt>
- <trkpt lat="28.705222222" lon="-17.938277778">
- <ele>902.800</ele>
- <speed>0.944444</speed>
- </trkpt>
- <trkpt lat="28.705277778" lon="-17.937750000">
- <ele>906.600</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.705333333" lon="-17.937222222">
- <ele>918.600</ele>
- <speed>1.000000</speed>
- </trkpt>
- <trkpt lat="28.705527778" lon="-17.936750000">
- <ele>928.200</ele>
- <speed>0.916667</speed>
- </trkpt>
- <trkpt lat="28.705444444" lon="-17.936222222">
- <ele>942.800</ele>
- <speed>1.000000</speed>
- </trkpt>
- <trkpt lat="28.705500000" lon="-17.935694444">
- <ele>947.800</ele>
- <speed>0.972222</speed>
- </trkpt>
- <trkpt lat="28.705527778" lon="-17.935166667">
- <ele>955.200</ele>
- <speed>0.916667</speed>
- </trkpt>
- <trkpt lat="28.705666667" lon="-17.934666667">
- <ele>970.800</ele>
- <speed>0.916667</speed>
- </trkpt>
- <trkpt lat="28.705694444" lon="-17.934138889">
- <ele>981.800</ele>
- <speed>0.861111</speed>
- </trkpt>
- <trkpt lat="28.705722222" lon="-17.933611111">
- <ele>988.800</ele>
- <speed>0.944444</speed>
- </trkpt>
- <trkpt lat="28.705694444" lon="-17.933083333">
- <ele>1001.400</ele>
- <speed>1.527778</speed>
- </trkpt>
- <trkpt lat="28.705444444" lon="-17.932638889">
- <ele>1009.600</ele>
- <speed>1.083333</speed>
- </trkpt>
- <trkpt lat="28.705277778" lon="-17.932555556">
- <ele>1013.200</ele>
- <speed>1.944444</speed>
- </trkpt>
- <trkpt lat="28.705027778" lon="-17.932111111">
- <ele>1017.200</ele>
- <speed>0.638889</speed>
- </trkpt>
- <trkpt lat="28.704583333" lon="-17.931944444">
- <ele>1010.600</ele>
- <speed>1.027778</speed>
- </trkpt>
- <trkpt lat="28.704527778" lon="-17.932472222">
- <ele>1006.000</ele>
- <speed>1.472222</speed>
- </trkpt>
- <trkpt lat="28.704111111" lon="-17.932666667">
- <ele>1006.000</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.703805556" lon="-17.933055556">
- <ele>1009.200</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.703388889" lon="-17.933250000">
- <ele>1002.400</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.703027778" lon="-17.933555556">
- <ele>996.200</ele>
- <speed>0.583333</speed>
- </trkpt>
- <trkpt lat="28.702777778" lon="-17.933111111">
- <ele>992.000</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.702583333" lon="-17.932611111">
- <ele>978.400</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.702166667" lon="-17.932861111">
- <ele>974.800</ele>
- <speed>1.666667</speed>
- </trkpt>
- <trkpt lat="28.701861111" lon="-17.933250000">
- <ele>974.800</ele>
- <speed>0.944444</speed>
- </trkpt>
- <trkpt lat="28.701416667" lon="-17.933361111">
- <ele>974.400</ele>
- <speed>1.277778</speed>
- </trkpt>
- <trkpt lat="28.700944444" lon="-17.933388889">
- <ele>971.000</ele>
- <speed>1.527778</speed>
- </trkpt>
- <trkpt lat="28.700833333" lon="-17.933305556">
- <ele>969.400</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.700833333" lon="-17.933305556">
- <ele>966.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700833333" lon="-17.933333333">
- <ele>971.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700722222" lon="-17.933166667">
- <ele>967.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700638889" lon="-17.932638889">
- <ele>964.800</ele>
- <speed>0.666667</speed>
- </trkpt>
- <trkpt lat="28.700666667" lon="-17.931805556">
- <ele>952.800</ele>
- <speed>1.222222</speed>
- </trkpt>
- <trkpt lat="28.700555556" lon="-17.932861111">
- <ele>1045.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700416667" lon="-17.933916667">
- <ele>952.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700527778" lon="-17.933222222">
- <ele>829.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700805556" lon="-17.932250000">
- <ele>892.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700611111" lon="-17.933000000">
- <ele>1031.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700500000" lon="-17.933555556">
- <ele>938.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700611111" lon="-17.932833333">
- <ele>868.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700805556" lon="-17.931888889">
- <ele>955.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700638889" lon="-17.932722222">
- <ele>1050.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700833333" lon="-17.931972222">
- <ele>948.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700722222" lon="-17.932694444">
- <ele>1025.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701416667" lon="-17.932055556">
- <ele>957.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700805556" lon="-17.932583333">
- <ele>952.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700388889" lon="-17.932333333">
- <ele>942.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699972222" lon="-17.932111111">
- <ele>943.800</ele>
- <speed>1.083333</speed>
- </trkpt>
- <trkpt lat="28.698750000" lon="-17.932194444">
- <ele>938.800</ele>
- <speed>1.472222</speed>
- </trkpt>
- <trkpt lat="28.698388889" lon="-17.931861111">
- <ele>939.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.698194444" lon="-17.932333333">
- <ele>945.000</ele>
- <speed>1.805556</speed>
- </trkpt>
- <trkpt lat="28.697861111" lon="-17.932694444">
- <ele>950.000</ele>
- <speed>0.777778</speed>
- </trkpt>
- <trkpt lat="28.697388889" lon="-17.932666667">
- <ele>961.200</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.696916667" lon="-17.932666667">
- <ele>968.800</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.696638889" lon="-17.932250000">
- <ele>971.200</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.696444444" lon="-17.931777778">
- <ele>967.400</ele>
- <speed>0.972222</speed>
- </trkpt>
- <trkpt lat="28.696138889" lon="-17.931388889">
- <ele>966.600</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.696111111" lon="-17.930861111">
- <ele>961.400</ele>
- <speed>0.722222</speed>
- </trkpt>
- <trkpt lat="28.696055556" lon="-17.930333333">
- <ele>968.800</ele>
- <speed>0.750000</speed>
- </trkpt>
- <trkpt lat="28.695277778" lon="-17.931305556">
- <ele>968.000</ele>
- <speed>0.638889</speed>
- </trkpt>
- <trkpt lat="28.696388889" lon="-17.931111111">
- <ele>967.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.694972222" lon="-17.930861111">
- <ele>967.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.694861111" lon="-17.930361111">
- <ele>937.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.694694444" lon="-17.929861111">
- <ele>1009.200</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.694166667" lon="-17.930305556">
- <ele>1010.000</ele>
- <speed>0.888889</speed>
- </trkpt>
- <trkpt lat="28.693694444" lon="-17.930277778">
- <ele>1009.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.693805556" lon="-17.929777778">
- <ele>996.800</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.693444444" lon="-17.929444444">
- <ele>1000.600</ele>
- <speed>1.444444</speed>
- </trkpt>
- <trkpt lat="28.693555556" lon="-17.928944444">
- <ele>1013.000</ele>
- <speed>1.555556</speed>
- </trkpt>
- <trkpt lat="28.693500000" lon="-17.928416667">
- <ele>1013.400</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.692805556" lon="-17.928000000">
- <ele>1018.200</ele>
- <speed>0.555556</speed>
- </trkpt>
- <trkpt lat="28.692750000" lon="-17.927472222">
- <ele>1017.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.692305556" lon="-17.927638889">
- <ele>1029.000</ele>
- <speed>0.888889</speed>
- </trkpt>
- <trkpt lat="28.692250000" lon="-17.928166667">
- <ele>1028.600</ele>
- <speed>0.638889</speed>
- </trkpt>
- <trkpt lat="28.691805556" lon="-17.928333333">
- <ele>1028.600</ele>
- <speed>1.722222</speed>
- </trkpt>
- <trkpt lat="28.691444444" lon="-17.928638889">
- <ele>1034.400</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.691305556" lon="-17.928138889">
- <ele>1034.400</ele>
- <speed>1.583333</speed>
- </trkpt>
- <trkpt lat="28.690861111" lon="-17.928250000">
- <ele>1034.200</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.690527778" lon="-17.927888889">
- <ele>1037.000</ele>
- <speed>1.583333</speed>
- </trkpt>
- <trkpt lat="28.690055556" lon="-17.927916667">
- <ele>1032.000</ele>
- <speed>1.527778</speed>
- </trkpt>
- <trkpt lat="28.689638889" lon="-17.927694444">
- <ele>1024.800</ele>
- <speed>1.472222</speed>
- </trkpt>
- <trkpt lat="28.689277778" lon="-17.927333333">
- <ele>1025.000</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.688833333" lon="-17.927194444">
- <ele>1022.600</ele>
- <speed>1.000000</speed>
- </trkpt>
- <trkpt lat="28.688916667" lon="-17.926916667">
- <ele>1023.000</ele>
- <speed>1.222222</speed>
- </trkpt>
- <trkpt lat="28.689277778" lon="-17.926611111">
- <ele>1039.800</ele>
- <speed>0.833333</speed>
- </trkpt>
- <trkpt lat="28.689361111" lon="-17.926527778">
- <ele>1056.600</ele>
- <speed>0.805556</speed>
- </trkpt>
- <trkpt lat="28.689388889" lon="-17.926500000">
- <ele>1061.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.689333333" lon="-17.926527778">
- <ele>1065.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.689361111" lon="-17.926527778">
- <ele>1056.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.689333333" lon="-17.926527778">
- <ele>1060.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.689361111" lon="-17.926527778">
- <ele>1057.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.689194444" lon="-17.926638889">
- <ele>1058.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.688861111" lon="-17.926944444">
- <ele>1047.800</ele>
- <speed>0.666667</speed>
- </trkpt>
- <trkpt lat="28.688888889" lon="-17.927277778">
- <ele>1045.200</ele>
- <speed>0.527778</speed>
- </trkpt>
- <trkpt lat="28.689333333" lon="-17.927361111">
- <ele>1049.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.689694444" lon="-17.927666667">
- <ele>1030.600</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.690111111" lon="-17.927916667">
- <ele>1027.600</ele>
- <speed>1.638889</speed>
- </trkpt>
- <trkpt lat="28.690583333" lon="-17.927944444">
- <ele>1033.800</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.690888889" lon="-17.928333333">
- <ele>1035.600</ele>
- <speed>1.277778</speed>
- </trkpt>
- <trkpt lat="28.691305556" lon="-17.928111111">
- <ele>1030.400</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.691722222" lon="-17.928305556">
- <ele>1029.600</ele>
- <speed>0.861111</speed>
- </trkpt>
- <trkpt lat="28.692166667" lon="-17.928444444">
- <ele>1029.400</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.692222222" lon="-17.927888889">
- <ele>1029.600</ele>
- <speed>1.222222</speed>
- </trkpt>
- <trkpt lat="28.692583333" lon="-17.927555556">
- <ele>1030.200</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.692888889" lon="-17.927972222">
- <ele>1024.200</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.693222222" lon="-17.928333333">
- <ele>1016.600</ele>
- <speed>1.138889</speed>
- </trkpt>
- <trkpt lat="28.693611111" lon="-17.928611111">
- <ele>1016.600</ele>
- <speed>1.555556</speed>
- </trkpt>
- <trkpt lat="28.693500000" lon="-17.929111111">
- <ele>1016.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.693777778" lon="-17.929527778">
- <ele>1020.800</ele>
- <speed>0.805556</speed>
- </trkpt>
- <trkpt lat="28.693722222" lon="-17.930055556">
- <ele>1019.400</ele>
- <speed>1.000000</speed>
- </trkpt>
- <trkpt lat="28.693972222" lon="-17.930527778">
- <ele>1019.400</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.693444444" lon="-17.930444444">
- <ele>1018.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.694222222" lon="-17.930388889">
- <ele>1018.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.694583333" lon="-17.930055556">
- <ele>1018.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.694861111" lon="-17.930472222">
- <ele>1000.200</ele>
- <speed>1.527778</speed>
- </trkpt>
- <trkpt lat="28.695250000" lon="-17.930750000">
- <ele>1004.000</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.695416667" lon="-17.931250000">
- <ele>1005.600</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.695777778" lon="-17.930944444">
- <ele>1004.800</ele>
- <speed>0.805556</speed>
- </trkpt>
- <trkpt lat="28.695972222" lon="-17.930444444">
- <ele>987.400</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.696361111" lon="-17.930722222">
- <ele>977.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.696250000" lon="-17.931555556">
- <ele>977.600</ele>
- <speed>1.138889</speed>
- </trkpt>
- <trkpt lat="28.696611111" lon="-17.931888889">
- <ele>962.400</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.696722222" lon="-17.932388889">
- <ele>962.600</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.697027778" lon="-17.932777778">
- <ele>962.600</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.697500000" lon="-17.932833333">
- <ele>966.800</ele>
- <speed>1.555556</speed>
- </trkpt>
- <trkpt lat="28.697944444" lon="-17.932750000">
- <ele>968.600</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.698277778" lon="-17.932388889">
- <ele>962.200</ele>
- <speed>1.000000</speed>
- </trkpt>
- <trkpt lat="28.698472222" lon="-17.932055556">
- <ele>954.400</ele>
- <speed>0.666667</speed>
- </trkpt>
- <trkpt lat="28.698722222" lon="-17.932222222">
- <ele>941.200</ele>
- <speed>0.944444</speed>
- </trkpt>
- <trkpt lat="28.699111111" lon="-17.931944444">
- <ele>946.000</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.699555556" lon="-17.931861111">
- <ele>933.800</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.700000000" lon="-17.932055556">
- <ele>933.600</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.700333333" lon="-17.932416667">
- <ele>937.600</ele>
- <speed>1.638889</speed>
- </trkpt>
- <trkpt lat="28.700888889" lon="-17.932416667">
- <ele>930.800</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.700777778" lon="-17.932666667">
- <ele>933.200</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700750000" lon="-17.932722222">
- <ele>937.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700555556" lon="-17.933194444">
- <ele>943.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700805556" lon="-17.933277778">
- <ele>928.800</ele>
- <speed>0.611111</speed>
- </trkpt>
- <trkpt lat="28.700916667" lon="-17.933361111">
- <ele>944.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700888889" lon="-17.933333333">
- <ele>959.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700805556" lon="-17.933361111">
- <ele>957.000</ele>
- <speed>0.638889</speed>
- </trkpt>
- <trkpt lat="28.701222222" lon="-17.933583333">
- <ele>963.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.701666667" lon="-17.933416667">
- <ele>967.800</ele>
- <speed>1.472222</speed>
- </trkpt>
- <trkpt lat="28.702083333" lon="-17.933222222">
- <ele>961.400</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.702388889" lon="-17.932833333">
- <ele>960.800</ele>
- <speed>1.527778</speed>
- </trkpt>
- <trkpt lat="28.702805556" lon="-17.933083333">
- <ele>964.000</ele>
- <speed>1.472222</speed>
- </trkpt>
- <trkpt lat="28.702944444" lon="-17.933583333">
- <ele>964.800</ele>
- <speed>0.944444</speed>
- </trkpt>
- <trkpt lat="28.703194444" lon="-17.934027778">
- <ele>967.800</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.703472222" lon="-17.934444444">
- <ele>975.400</ele>
- <speed>1.277778</speed>
- </trkpt>
- <trkpt lat="28.703833333" lon="-17.934138889">
- <ele>971.000</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.703833333" lon="-17.934750000">
- <ele>961.800</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.704027778" lon="-17.935222222">
- <ele>958.400</ele>
- <speed>1.666667</speed>
- </trkpt>
- <trkpt lat="28.704111111" lon="-17.935750000">
- <ele>952.800</ele>
- <speed>1.000000</speed>
- </trkpt>
- <trkpt lat="28.704361111" lon="-17.936194444">
- <ele>945.400</ele>
- <speed>1.083333</speed>
- </trkpt>
- <trkpt lat="28.704777778" lon="-17.936388889">
- <ele>940.800</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.704472222" lon="-17.936861111">
- <ele>938.800</ele>
- <speed>1.555556</speed>
- </trkpt>
- <trkpt lat="28.704000000" lon="-17.936861111">
- <ele>911.000</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.703833333" lon="-17.936361111">
- <ele>918.800</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.703583333" lon="-17.936805556">
- <ele>920.400</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.703305556" lon="-17.937222222">
- <ele>914.800</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.702861111" lon="-17.937361111">
- <ele>911.200</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.702500000" lon="-17.937694444">
- <ele>900.200</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.702111111" lon="-17.937972222">
- <ele>896.000</ele>
- <speed>1.472222</speed>
- </trkpt>
- <trkpt lat="28.701638889" lon="-17.937972222">
- <ele>891.600</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.701194444" lon="-17.937861111">
- <ele>884.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700888889" lon="-17.937472222">
- <ele>882.200</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.701000000" lon="-17.936972222">
- <ele>883.000</ele>
- <speed>1.472222</speed>
- </trkpt>
- <trkpt lat="28.700666667" lon="-17.936611111">
- <ele>879.600</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.700194444" lon="-17.936694444">
- <ele>880.000</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.699722222" lon="-17.936694444">
- <ele>883.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699444444" lon="-17.937111111">
- <ele>885.200</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.699000000" lon="-17.937194444">
- <ele>870.200</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.698555556" lon="-17.937027778">
- <ele>860.400</ele>
- <speed>1.472222</speed>
- </trkpt>
- <trkpt lat="28.698138889" lon="-17.937277778">
- <ele>863.200</ele>
- <speed>1.277778</speed>
- </trkpt>
- <trkpt lat="28.698583333" lon="-17.937388889">
- <ele>856.400</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.698777778" lon="-17.937861111">
- <ele>843.400</ele>
- <speed>1.555556</speed>
- </trkpt>
- <trkpt lat="28.698944444" lon="-17.938361111">
- <ele>839.000</ele>
- <speed>1.527778</speed>
- </trkpt>
- <trkpt lat="28.699388889" lon="-17.938277778">
- <ele>833.200</ele>
- <speed>1.083333</speed>
- </trkpt>
- <trkpt lat="28.699750000" lon="-17.937944444">
- <ele>828.600</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.699805556" lon="-17.938472222">
- <ele>828.600</ele>
- <speed>1.611111</speed>
- </trkpt>
- <trkpt lat="28.699888889" lon="-17.939000000">
- <ele>827.400</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.700000000" lon="-17.939500000">
- <ele>820.600</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.700138889" lon="-17.940000000">
- <ele>806.600</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.700111111" lon="-17.940527778">
- <ele>810.800</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.699972222" lon="-17.941027778">
- <ele>806.200</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.699916667" lon="-17.941555556">
- <ele>805.000</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.700138889" lon="-17.942055556">
- <ele>802.200</ele>
- <speed>1.138889</speed>
- </trkpt>
- <trkpt lat="28.700583333" lon="-17.942138889">
- <ele>797.200</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.700833333" lon="-17.942583333">
- <ele>793.600</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.700916667" lon="-17.943111111">
- <ele>785.800</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.700750000" lon="-17.943611111">
- <ele>777.400</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.700472222" lon="-17.944027778">
- <ele>778.000</ele>
- <speed>1.305556</speed>
- </trkpt>
- <trkpt lat="28.700361111" lon="-17.944527778">
- <ele>776.200</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.700333333" lon="-17.945055556">
- <ele>780.200</ele>
- <speed>1.666667</speed>
- </trkpt>
- <trkpt lat="28.700444444" lon="-17.945555556">
- <ele>785.400</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.700861111" lon="-17.945750000">
- <ele>782.200</ele>
- <speed>1.472222</speed>
- </trkpt>
- <trkpt lat="28.701305556" lon="-17.945638889">
- <ele>773.600</ele>
- <speed>1.444444</speed>
- </trkpt>
- <trkpt lat="28.701555556" lon="-17.945194444">
- <ele>772.000</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.701888889" lon="-17.945555556">
- <ele>777.800</ele>
- <speed>1.472222</speed>
- </trkpt>
- <trkpt lat="28.702250000" lon="-17.945861111">
- <ele>759.600</ele>
- <speed>1.444444</speed>
- </trkpt>
- <trkpt lat="28.702666667" lon="-17.945666667">
- <ele>753.600</ele>
- <speed>1.388889</speed>
- </trkpt>
- <trkpt lat="28.702750000" lon="-17.946194444">
- <ele>754.800</ele>
- <speed>1.444444</speed>
- </trkpt>
- <trkpt lat="28.702527778" lon="-17.946666667">
- <ele>742.600</ele>
- <speed>1.555556</speed>
- </trkpt>
- <trkpt lat="28.702333333" lon="-17.947138889">
- <ele>735.800</ele>
- <speed>1.277778</speed>
- </trkpt>
- <trkpt lat="28.702250000" lon="-17.947666667">
- <ele>727.000</ele>
- <speed>1.277778</speed>
- </trkpt>
- <trkpt lat="28.702000000" lon="-17.948111111">
- <ele>722.600</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.701750000" lon="-17.948555556">
- <ele>719.400</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.702083333" lon="-17.948916667">
- <ele>710.400</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.701611111" lon="-17.948972222">
- <ele>688.800</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.701500000" lon="-17.949472222">
- <ele>677.400</ele>
- <speed>1.166667</speed>
- </trkpt>
- <trkpt lat="28.701361111" lon="-17.949972222">
- <ele>671.600</ele>
- <speed>0.861111</speed>
- </trkpt>
- <trkpt lat="28.701111111" lon="-17.950416667">
- <ele>664.200</ele>
- <speed>1.027778</speed>
- </trkpt>
- <trkpt lat="28.701138889" lon="-17.950944444">
- <ele>655.200</ele>
- <speed>1.138889</speed>
- </trkpt>
- <trkpt lat="28.700777778" lon="-17.950944444">
- <ele>648.600</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.700583333" lon="-17.950472222">
- <ele>622.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.700138889" lon="-17.950305556">
- <ele>615.600</ele>
- <speed>1.055556</speed>
- </trkpt>
- <trkpt lat="28.699750000" lon="-17.950027778">
- <ele>620.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.699416667" lon="-17.949666667">
- <ele>618.000</ele>
- <speed>1.555556</speed>
- </trkpt>
- <trkpt lat="28.698972222" lon="-17.949777778">
- <ele>620.800</ele>
- <speed>1.277778</speed>
- </trkpt>
- <trkpt lat="28.698500000" lon="-17.949722222">
- <ele>624.400</ele>
- <speed>1.083333</speed>
- </trkpt>
- <trkpt lat="28.698055556" lon="-17.949555556">
- <ele>626.200</ele>
- <speed>0.972222</speed>
- </trkpt>
- <trkpt lat="28.697861111" lon="-17.949083333">
- <ele>634.400</ele>
- <speed>1.000000</speed>
- </trkpt>
- </trkseg>
- </trk>
- <trk>
- <name>2-1-06</name>
- <desc>TAZACORTE</desc>
- <number>3</number>
- <trkseg>
- <trkpt lat="28.663388889" lon="-17.942472222">
- <ele>-4542.400</ele>
- </trkpt>
- <trkpt lat="28.663444444" lon="-17.942444444">
- <ele>518.600</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.663444444" lon="-17.942444444">
- <ele>525.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.663805556" lon="-17.942500000">
- <ele>530.400</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.663527778" lon="-17.942916667">
- <ele>530.800</ele>
- <speed>1.111111</speed>
- </trkpt>
- <trkpt lat="28.663055556" lon="-17.942916667">
- <ele>507.000</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.662583333" lon="-17.942916667">
- <ele>509.200</ele>
- <speed>1.361111</speed>
- </trkpt>
- <trkpt lat="28.662138889" lon="-17.943027778">
- <ele>507.800</ele>
- <speed>2.638889</speed>
- </trkpt>
- <trkpt lat="28.661694444" lon="-17.943194444">
- <ele>495.200</ele>
- <speed>1.083333</speed>
- </trkpt>
- <trkpt lat="28.661250000" lon="-17.943333333">
- <ele>492.200</ele>
- <speed>1.333333</speed>
- </trkpt>
- <trkpt lat="28.660805556" lon="-17.943472222">
- <ele>486.200</ele>
- <speed>1.194444</speed>
- </trkpt>
- <trkpt lat="28.660361111" lon="-17.943583333">
- <ele>478.800</ele>
- <speed>1.638889</speed>
- </trkpt>
- <trkpt lat="28.659888889" lon="-17.943555556">
- <ele>464.400</ele>
- <speed>0.944444</speed>
- </trkpt>
- <trkpt lat="28.659638889" lon="-17.943500000">
- <ele>454.200</ele>
- <speed>1.027778</speed>
- </trkpt>
- <trkpt lat="28.659250000" lon="-17.943777778">
- <ele>457.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.658861111" lon="-17.944055556">
- <ele>432.400</ele>
- <speed>0.777778</speed>
- </trkpt>
- <trkpt lat="28.658472222" lon="-17.944333333">
- <ele>415.000</ele>
- <speed>0.000000</speed>
- </trkpt>
- <trkpt lat="28.658333333" lon="-17.944833333">
- <ele>406.000</ele>
- <speed>1.250000</speed>
- </trkpt>
- <trkpt lat="28.658777778" lon="-17.945000000">
- <ele>392.600</ele>
- <speed>1.083333</speed>
- </trkpt>
- <trkpt lat="28.658916667" lon="-17.945500000">
- <ele>390.200</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.658555556" lon="-17.945833333">
- <ele>377.000</ele>
- <speed>1.277778</speed>
- </trkpt>
- <trkpt lat="28.658194444" lon="-17.946194444">
- <ele>368.800</ele>
- <speed>1.138889</speed>
- </trkpt>
- <trkpt lat="28.657916667" lon="-17.946611111">
- <ele>351.400</ele>
- <speed>1.416667</speed>
- </trkpt>
- <trkpt lat="28.657611111" lon="-17.947000000">
- <ele>341.000</ele>
- <speed>1.222222</speed>
- </trkpt>
- <trkpt lat="28.657194444" lon="-17.947194444">
- <ele>331.400</ele>
- <speed>1.083333</speed>
- </trkpt>
- <trkpt lat="28.652027778" lon="-17.946500000">
- <ele>328.000</ele>
- <speed>1.500000</speed>
- </trkpt>
- <trkpt lat="28.649722222" lon="-17.946305556">
- <ele>327.800</ele>
- <speed>0.000000</speed>
- </trkpt>
- </trkseg>
- </trk>
-</gpx>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="28.455250000" minlon="-17.980111111" maxlat="47.650694444" maxlon="9.483111111"/>
- <wpt lat="47.650694444" lon="9.483111111">
- <time>2005-12-27T16:09:39Z</time>
- <name>Home</name>
- <cmt>Sweet_Home</cmt>
- <desc>Sweet_Home</desc>
- </wpt>
- <wpt lat="28.620472222" lon="-17.752805556">
- <time>2005-12-27T16:09:39Z</time>
- <name>Airport</name>
- <cmt>Santa_Cruz</cmt>
- <desc>Santa_Cruz</desc>
- </wpt>
- <wpt lat="28.830361111" lon="-17.803222222">
- <time>2005-12-27T16:09:39Z</time>
- <name>GAS001</name>
- <cmt>Barlovento</cmt>
- <desc>Barlovento</desc>
- </wpt>
- <wpt lat="28.763444444" lon="-17.977722222">
- <time>2005-12-27T16:09:39Z</time>
- <name>GAS002</name>
- <cmt>Puntagorda</cmt>
- <desc>Puntagorda</desc>
- </wpt>
- <wpt lat="28.766000000" lon="-17.980111111">
- <time>2005-12-27T16:09:39Z</time>
- <name>Police</name>
- <cmt>Puntagorda</cmt>
- <desc>Puntagorda</desc>
- </wpt>
- <wpt lat="28.689583333" lon="-17.767472222">
- <time>2005-12-27T16:09:39Z</time>
- <name>SMrkt01</name>
- <cmt>Santa_Cruz</cmt>
- <desc>Santa_Cruz</desc>
- </wpt>
- <wpt lat="28.651083333" lon="-17.881027778">
- <time>2005-12-27T16:09:39Z</time>
- <name>SMrkt02</name>
- <cmt>El_Paso</cmt>
- <desc>El_Paso</desc>
- </wpt>
- <wpt lat="28.778305556" lon="-17.906250000">
- <time>2005-12-27T16:09:39Z</time>
- <name>PARK01</name>
- <cmt>SmallParking</cmt>
- <desc>SmallParking</desc>
- </wpt>
- <wpt lat="28.791527778" lon="-17.799361111">
- <time>2005-12-27T16:09:39Z</time>
- <name>PARK02</name>
- <cmt>Tilos_Trail</cmt>
- <desc>Tilos_Trail</desc>
- </wpt>
- <wpt lat="28.780388889" lon="-17.962944444">
- <time>2005-12-27T16:09:39Z</time>
- <name>PARK03</name>
- <cmt>Las_Tricia</cmt>
- <desc>Las_Tricia</desc>
- </wpt>
- <wpt lat="28.811111111" lon="-17.805222222">
- <time>2005-12-27T16:09:39Z</time>
- <name>Barloven</name>
- <cmt>Barlovento</cmt>
- <desc>Barlovento</desc>
- </wpt>
- <wpt lat="28.692500000" lon="-17.876888889">
- <time>2005-12-27T16:09:39Z</time>
- <name>Bejenado</name>
- <cmt>Bejenado</cmt>
- <desc>Bejenado</desc>
- </wpt>
- <wpt lat="28.697916667" lon="-17.856750000">
- <time>2005-12-27T16:09:39Z</time>
- <name>Cumbreci</name>
- <cmt>Cumbrecita</cmt>
- <desc>Cumbrecita</desc>
- </wpt>
- <wpt lat="28.578805556" lon="-17.838083333">
- <time>2005-12-27T16:09:39Z</time>
- <name>Durazner</name>
- <cmt>Duraznero</cmt>
- <desc>Duraznero</desc>
- </wpt>
- <wpt lat="28.614916667" lon="-17.836777778">
- <time>2005-12-27T16:09:39Z</time>
- <name>El_Pilar</name>
- <cmt>El_Pilar</cmt>
- <desc>El_Pilar</desc>
- </wpt>
- <wpt lat="28.689138889" lon="-17.870083333">
- <time>2005-12-27T16:09:39Z</time>
- <name>El_Rodeo</name>
- <cmt>El_Rodeo</cmt>
- <desc>El_Rodeo</desc>
- </wpt>
- <wpt lat="28.455361111" lon="-17.843166667">
- <time>2005-12-27T16:09:39Z</time>
- <name>FaroFuen</name>
- <cmt>Fuencaliente</cmt>
- <desc>Fuencaliente</desc>
- </wpt>
- <wpt lat="28.730166667" lon="-17.813666667">
- <time>2005-12-27T16:09:39Z</time>
- <name>F.Olen</name>
- <cmt>Fuente_Olen</cmt>
- <desc>Fuente_Olen</desc>
- </wpt>
- <wpt lat="28.583250000" lon="-17.837527778">
- <time>2005-12-27T16:09:39Z</time>
- <name>HoyoNegr</name>
- <cmt>Hoyo_Negro</cmt>
- <desc>Hoyo_Negro</desc>
- </wpt>
- <wpt lat="28.754305556" lon="-17.884805556">
- <time>2005-12-27T16:09:39Z</time>
- <name>Muchacho</name>
- <cmt>Rq.Muchachos</cmt>
- <desc>Rq.Muchachos</desc>
- </wpt>
- <wpt lat="28.609750000" lon="-17.839944444">
- <time>2005-12-27T16:09:39Z</time>
- <name>M.Birigo</name>
- <cmt>M_Birigoyo</cmt>
- <desc>M_Birigoyo</desc>
- </wpt>
- <wpt lat="28.629027778" lon="-17.802027778">
- <time>2005-12-27T16:09:39Z</time>
- <name>S.Isidro</name>
- <cmt>San_Isidro</cmt>
- <desc>San_Isidro</desc>
- </wpt>
- <wpt lat="28.688250000" lon="-17.761611111">
- <time>2005-12-27T16:09:39Z</time>
- <name>S.Maria</name>
- <cmt>Santa_Maria</cmt>
- <desc>Santa_Maria</desc>
- </wpt>
- <wpt lat="28.647277778" lon="-17.944055556">
- <time>2005-12-27T16:09:39Z</time>
- <name>Tazacort</name>
- <cmt>Tazacorte</cmt>
- <desc>Tazacorte</desc>
- </wpt>
- <wpt lat="28.692805556" lon="-17.924444444">
- <time>2005-12-27T16:09:39Z</time>
- <name>T.d.Time</name>
- <cmt>Tor_del_Time</cmt>
- <desc>Tor_del_Time</desc>
- </wpt>
- <wpt lat="28.802388889" lon="-17.906944444">
- <time>2005-12-27T16:09:39Z</time>
- <name>Zarza</name>
- <cmt>La_Zarza</cmt>
- <desc>La_Zarza</desc>
- </wpt>
- <wpt lat="28.801638889" lon="-17.908722222">
- <time>2005-12-27T16:09:39Z</time>
- <name>Zarzita</name>
- <cmt>La_Zarzita</cmt>
- <desc>La_Zarzita</desc>
- </wpt>
- <wpt lat="28.723027778" lon="-17.875583333">
- <time>2005-12-27T16:09:39Z</time>
- <name>SRVCENTR</name>
- <cmt>Servicecentr</cmt>
- <desc>Servicecentr</desc>
- </wpt>
- <wpt lat="28.501916667" lon="-17.843888889">
- <time>2005-12-27T16:09:39Z</time>
- <name>TGR130</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.688777778" lon="-17.927250000">
- <time>2005-12-27T16:09:39Z</time>
- <name>TGR131</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.622972222" lon="-17.844805556">
- <time>2005-12-27T16:09:39Z</time>
- <name>TPRLP14</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.562611111" lon="-17.836833333">
- <time>2005-12-27T16:09:39Z</time>
- <name>TPRLP15</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.587416667" lon="-17.837694444">
- <time>2005-12-27T16:09:39Z</time>
- <name>TPRLP16</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.619361111" lon="-17.858638889">
- <time>2005-12-27T16:09:39Z</time>
- <name>TSLEP103</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.603194444" lon="-17.846388889">
- <time>2005-12-27T16:09:39Z</time>
- <name>TSLEP107</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.601944444" lon="-17.880944444">
- <time>2005-12-27T16:09:39Z</time>
- <name>TSLEP107</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.525138889" lon="-17.837555556">
- <time>2005-12-27T16:09:39Z</time>
- <name>TSLFU110</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.536055556" lon="-17.842666667">
- <time>2005-12-27T16:09:39Z</time>
- <name>TSLFU111</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.767166667" lon="-17.832916667">
- <time>2005-12-27T16:09:39Z</time>
- <name>TSLSAS30</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.703972222" lon="-17.925750000">
- <time>2005-12-27T16:09:39Z</time>
- <name>TSLTJ71</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.702138889" lon="-17.951472222">
- <time>2005-12-27T16:09:39Z</time>
- <name>TSLTJ71a</name>
- <cmt>Trailhead</cmt>
- <desc>Trailhead</desc>
- </wpt>
- <wpt lat="28.561555556" lon="-17.836500000">
- <time>2005-12-27T16:09:39Z</time>
- <name>GC7CF</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.518166667" lon="-17.834250000">
- <time>2005-12-27T16:09:39Z</time>
- <name>GCN1TQ</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.603000000" lon="-17.877250000">
- <time>2005-12-27T16:09:39Z</time>
- <name>GCNXY8</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.622666667" lon="-17.848777778">
- <time>2005-12-27T16:09:39Z</time>
- <name>GCHT8C</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.480750000" lon="-17.856500000">
- <time>2005-12-27T16:09:39Z</time>
- <name>GCNQXK</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.653916667" lon="-17.852722222">
- <time>2005-12-27T16:09:39Z</time>
- <name>GCD098</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.455250000" lon="-17.843555556">
- <time>2005-12-27T16:09:39Z</time>
- <name>GCM6N0</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.668027778" lon="-17.831361111">
- <time>2005-12-27T16:09:39Z</time>
- <name>GC405B</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.651138889" lon="-17.946194444">
- <time>2005-12-27T16:09:39Z</time>
- <name>GCD096</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.692055556" lon="-17.875194444">
- <time>2005-12-27T16:09:39Z</time>
- <name>GCNXKV</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.703805556" lon="-17.845555556">
- <time>2005-12-27T16:09:39Z</time>
- <name>GCNXMD</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.710027778" lon="-17.954611111">
- <time>2005-12-27T16:09:39Z</time>
- <name>GCHND9</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.766861111" lon="-17.833194444">
- <time>2005-12-27T16:09:39Z</time>
- <name>GC405C</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </wpt>
- <wpt lat="28.698000000" lon="-17.949055556">
- <time>2005-12-29T10:41:43Z</time>
- <name>FH-HAUS</name>
- </wpt>
- <wpt lat="28.696750000" lon="-17.950194444">
- <time>2005-12-29T11:01:17Z</time>
- <name>FH-DRIVE</name>
- </wpt>
- <wpt lat="28.710055556" lon="-17.954638889">
- <time>2005-12-31T10:31:52Z</time>
- <name>GCHND9-1</name>
- </wpt>
- <wpt lat="28.710944444" lon="-17.955277778">
- <time>2005-12-31T10:31:52Z</time>
- <name>GCHND9-2</name>
- </wpt>
- <wpt lat="28.707222222" lon="-17.950888889">
- <time>2005-12-31T10:31:52Z</time>
- <name>GCHND9-3</name>
- </wpt>
- <wpt lat="28.722111111" lon="-17.979694444">
- <time>2006-01-03T13:46:38Z</time>
- <name>PL VETA</name>
- <cmt>PLAYA VETA</cmt>
- <desc>PLAYA VETA</desc>
- </wpt>
- <rte>
- <name>GCHND9</name>
- <rtept lat="28.710027778" lon="-17.954611111">
- <time>2005-12-27T16:09:39Z</time>
- <name>GCHND9</name>
- <cmt>Geocache</cmt>
- <desc>Geocache</desc>
- </rtept>
- <rtept lat="28.710055556" lon="-17.954638889">
- <time>2005-12-31T10:31:52Z</time>
- <name>GCHND9-1</name>
- </rtept>
- <rtept lat="28.710944444" lon="-17.955277778">
- <time>2005-12-31T10:31:52Z</time>
- <name>GCHND9-2</name>
- </rtept>
- <rtept lat="28.707222222" lon="-17.950888889">
- <time>2005-12-31T10:31:52Z</time>
- <name>GCHND9-3</name>
- </rtept>
- </rte>
-</gpx>
+++ /dev/null
-41.11111, -85.16351,
-41.11048, -85.16341,
-41.10986, -85.16348,
-41.10908, -85.16357,
-41.11138, -85.16216,
-41.11058, -85.16223,
-41.10990, -85.16239,
-41.10923, -85.16255,
-41.11138, -85.16130,
-41.11068, -85.16127,
-41.11000, -85.16139,
-41.10920, -85.16155,
-41.11142, -85.16002,
-41.11075, -85.16030,
-41.11005, -85.16050,
-41.10964, -85.16062,
-41.10824, -85.16373,
-41.10821, -85.16300,
-41.10817, -85.16216,
-41.10846, -85.16123,
-41.10768, -85.16409,
-41.10756, -85.16300,
-41.10768, -85.16210,
-41.10778, -85.16123,
-41.10684, -85.16383,
-41.10681, -85.16287,
-alantrl trl Alan Map500 tracklogs (.trl)
-alanwpr wpr Alan Map500 waypoints and routes (.wpr)
baroiq Brauniger IQ Series Barograph Download
bushnell_trl trl Bushnell GPS Trail file
bushnell wpt Bushnell GPS Waypoint file
compegps CompeGPS data files (.wpt/.trk/.rte)
iblue747 csv Data Logger iBlue747 csv
iblue757 csv Data Logger iBlue757 csv
-an1 an1 DeLorme .an1 (drawing) file
gpl gpl DeLorme GPL
saplus DeLorme Street Atlas Plus
saroute anr DeLorme Street Atlas Route
navilink NaviGPS GT-11/BGT-11 Download
sbp sbp NaviGPS GT-31/BGT-31 datalogger (.sbp)
sbn sbn NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn)
-naviguide twl Naviguide binary route file (.twl)
navitel_trk bin Navitel binary track (.bin)
dna dna Navitrak DNA marker format
-netstumbler NetStumbler Summary File (text)
nima NIMA/GNIS Geographic Names File
nmea NMEA 0183 sentences
lmx Nokia Landmark Exchange
internal xcsv ? Character Separated Values
-file alantrl trl Alan Map500 tracklogs (.trl)
-file alanwpr wpr Alan Map500 waypoints and routes (.wpr)
internal tabsep All database fields on one tab-separated line
serial baroiq Brauniger IQ Series Barograph Download
file bushnell_trl trl Bushnell GPS Trail file
internal custom Custom "Everything" Style
file iblue747 csv Data Logger iBlue747 csv
file iblue757 csv Data Logger iBlue757 csv
-file an1 an1 DeLorme .an1 (drawing) file
file gpl gpl DeLorme GPL
file saplus DeLorme Street Atlas Plus
file saroute anr DeLorme Street Atlas Route
serial navilink NaviGPS GT-11/BGT-11 Download
file sbp sbp NaviGPS GT-31/BGT-31 datalogger (.sbp)
file sbn sbn NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn)
-file naviguide twl Naviguide binary route file (.twl)
file navitel_trk bin Navitel binary track (.bin)
file dna dna Navitrak DNA marker format
-file netstumbler NetStumbler Summary File (text)
file nima NIMA/GNIS Geographic Names File
file nmea NMEA 0183 sentences
file lmx Nokia Landmark Exchange
internal rw---- xcsv ? Character Separated Values
-file --rw-- alantrl trl Alan Map500 tracklogs (.trl)
-file rw--rw alanwpr wpr Alan Map500 waypoints and routes (.wpr)
internal rw---- tabsep All database fields on one tab-separated line
serial --r--- baroiq Brauniger IQ Series Barograph Download
file --rw-- bushnell_trl trl Bushnell GPS Trail file
internal rw---- custom Custom "Everything" Style
file --rw-- iblue747 csv Data Logger iBlue747 csv
file --rw-- iblue757 csv Data Logger iBlue757 csv
-file rw-wrw an1 an1 DeLorme .an1 (drawing) file
file --rw-- gpl gpl DeLorme GPL
file rw---- saplus DeLorme Street Atlas Plus
file --r--- saroute anr DeLorme Street Atlas Route
serial rwrwrw navilink NaviGPS GT-11/BGT-11 Download
file --r--- sbp sbp NaviGPS GT-31/BGT-31 datalogger (.sbp)
file --r--- sbn sbn NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn)
-file rw---- naviguide twl Naviguide binary route file (.twl)
file --rw-- navitel_trk bin Navitel binary track (.bin)
file rw---- dna dna Navitrak DNA marker format
-file r----- netstumbler NetStumbler Summary File (text)
file rw---- nima NIMA/GNIS Geographic Names File
file rwrw-- nmea NMEA 0183 sentences
file rw---- lmx Nokia Landmark Exchange
option xcsv datum GPS datum (def. WGS 84) string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_xcsv.html#fmt_xcsv_o_datum
-file --rw-- alantrl trl Alan Map500 tracklogs (.trl) alantrl
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_alantrl.html
-file rw--rw alanwpr wpr Alan Map500 waypoints and routes (.wpr) alanwpr
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_alanwpr.html
internal rw---- tabsep All database fields on one tab-separated line xcsv
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tabsep.html
option tabsep snlen Max synthesized shortname length integer 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_tabsep.html#fmt_tabsep_o_snlen
option iblue757 datum GPS datum (def. WGS 84) string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_iblue757.html#fmt_iblue757_o_datum
-file rw-wrw an1 an1 DeLorme .an1 (drawing) file an1
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html
-option an1 type Type of .an1 file string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_type
-
-option an1 road Road type changes string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_road
-
-option an1 nogc Do not add geocache data to description boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_nogc
-
-option an1 nourl Do not add URLs to description boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_nourl
-
-option an1 deficon Symbol to use for point data string Red Flag https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_deficon
-
-option an1 color Color for lines or mapnotes string red https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_color
-
-option an1 zoom Zoom level to reduce points integer https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_zoom
-
-option an1 wpt_type Waypoint type string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_wpt_type
-
-option an1 radius Radius for circles string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_an1.html#fmt_an1_o_radius
-
file --rw-- gpl gpl DeLorme GPL gpl
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_gpl.html
file rw---- saplus DeLorme Street Atlas Plus xcsv
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_sbp.html
file --r--- sbn sbn NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn) sbn
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_sbn.html
-file rw---- naviguide twl Naviguide binary route file (.twl) naviguide
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_naviguide.html
-option naviguide output 'wp' - Create waypoint file , 'rte' - Create route file string rte https://www.gpsbabel.org/WEB_DOC_DIR/fmt_naviguide.html#fmt_naviguide_o_output
-
-option naviguide reorder 'n' - Keep the existing wp name, 'y' - rename waypoints string n https://www.gpsbabel.org/WEB_DOC_DIR/fmt_naviguide.html#fmt_naviguide_o_reorder
-
file --rw-- navitel_trk bin Navitel binary track (.bin) navitel_trk
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_navitel_trk.html
file rw---- dna dna Navitrak DNA marker format xcsv
option dna datum GPS datum (def. WGS 84) string https://www.gpsbabel.org/WEB_DOC_DIR/fmt_dna.html#fmt_dna_o_datum
-file r----- netstumbler NetStumbler Summary File (text) netstumbler
- https://www.gpsbabel.org/WEB_DOC_DIR/fmt_netstumbler.html
-option netstumbler nseicon Non-stealth encrypted icon name string Red Square https://www.gpsbabel.org/WEB_DOC_DIR/fmt_netstumbler.html#fmt_netstumbler_o_nseicon
-
-option netstumbler nsneicon Non-stealth non-encrypted icon name string Green Square https://www.gpsbabel.org/WEB_DOC_DIR/fmt_netstumbler.html#fmt_netstumbler_o_nsneicon
-
-option netstumbler seicon Stealth encrypted icon name string Red Diamond https://www.gpsbabel.org/WEB_DOC_DIR/fmt_netstumbler.html#fmt_netstumbler_o_seicon
-
-option netstumbler sneicon Stealth non-encrypted icon name string Green Diamond https://www.gpsbabel.org/WEB_DOC_DIR/fmt_netstumbler.html#fmt_netstumbler_o_sneicon
-
-option netstumbler snmac Shortname is MAC address boolean https://www.gpsbabel.org/WEB_DOC_DIR/fmt_netstumbler.html#fmt_netstumbler_o_snmac
-
file rw---- nima NIMA/GNIS Geographic Names File xcsv
https://www.gpsbabel.org/WEB_DOC_DIR/fmt_nima.html
option nima snlen Max synthesized shortname length integer 1 https://www.gpsbabel.org/WEB_DOC_DIR/fmt_nima.html#fmt_nima_o_snlen
-V Print GPSBabel version and exit
File Types (-i and -o options):
- alantrl Alan Map500 tracklogs (.trl)
- alanwpr Alan Map500 waypoints and routes (.wpr)
baroiq Brauniger IQ Series Barograph Download
bushnell_trl Bushnell GPS Trail file
bushnell Bushnell GPS Waypoint file
urlbase Basename prepended to URL on output
prefer_shortnames (0/1) Use shortname instead of description
datum GPS datum (def. WGS 84)
- an1 DeLorme .an1 (drawing) file
- type Type of .an1 file
- road Road type changes
- nogc (0/1) Do not add geocache data to description
- nourl (0/1) Do not add URLs to description
- deficon Symbol to use for point data
- color Color for lines or mapnotes
- zoom Zoom level to reduce points
- wpt_type Waypoint type
- radius Radius for circles
gpl DeLorme GPL
saplus DeLorme Street Atlas Plus
snlen Max synthesized shortname length
power_off (0/1) Command unit to power itself down
sbp NaviGPS GT-31/BGT-31 datalogger (.sbp)
sbn NaviGPS GT-31/BGT-31 SiRF binary logfile (.sbn)
- naviguide Naviguide binary route file (.twl)
- output 'wp' - Create waypoint file , 'rte' - Create route
- reorder 'n' - Keep the existing wp name, 'y' - rename wayp
navitel_trk Navitel binary track (.bin)
dna Navitrak DNA marker format
snlen Max synthesized shortname length
urlbase Basename prepended to URL on output
prefer_shortnames (0/1) Use shortname instead of description
datum GPS datum (def. WGS 84)
- netstumbler NetStumbler Summary File (text)
- nseicon Non-stealth encrypted icon name
- nsneicon Non-stealth non-encrypted icon name
- seicon Stealth encrypted icon name
- sneicon Stealth non-encrypted icon name
- snmac (0/1) Shortname is MAC address
nima NIMA/GNIS Geographic Names File
snlen Max synthesized shortname length
snwhite (0/1) Allow whitespace synth. shortnames
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="20.556257939" minlon="32.568395522" maxlat="22.556254099" maxlon="34.568387647"/>
- <rte>
- <rtept lat="22.556250760" lon="32.568395669">
- <ele>0.000</ele>
- <name>1</name>
- <cmt>1</cmt>
- <desc>1</desc>
- </rtept>
- <rtept lat="22.556254099" lon="34.568387354">
- <ele>0.000</ele>
- <name>2</name>
- <cmt>2</cmt>
- <desc>2</desc>
- </rtept>
- <rtept lat="20.556260799" lon="34.568387647">
- <ele>0.000</ele>
- <name>3</name>
- <cmt>3</cmt>
- <desc>3</desc>
- </rtept>
- <rtept lat="20.556257939" lon="32.568395522">
- <ele>0.000</ele>
- <name>4</name>
- <cmt>4</cmt>
- <desc>4</desc>
- </rtept>
- </rte>
-</gpx>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0">
- <time>1970-01-01T00:00:00Z</time>
- <bounds minlat="31.079040219" minlon="35.334211349" maxlat="31.151763832" maxlon="35.373254513"/>
- <rte>
- <rtept lat="31.151763832" lon="35.334211349">
- <ele>0.000</ele>
- <name>A001</name>
- <cmt>תחילת מסלול</cmt>
- <desc>תחילת מסלול</desc>
- </rtept>
- <rtept lat="31.148399233" lon="35.334595055">
- <ele>0.000</ele>
- <name>A002</name>
- </rtept>
- <rtept lat="31.145292030" lon="35.339268116">
- <ele>0.000</ele>
- <name>A003</name>
- </rtept>
- <rtept lat="31.148122342" lon="35.349769369">
- <ele>0.000</ele>
- <name>A004</name>
- </rtept>
- <rtept lat="31.137824342" lon="35.356046003">
- <ele>0.000</ele>
- <name>A005</name>
- </rtept>
- <rtept lat="31.140849812" lon="35.360496718">
- <ele>0.000</ele>
- <name>A006</name>
- </rtept>
- <rtept lat="31.143549991" lon="35.365314221">
- <ele>0.000</ele>
- <name>A007</name>
- <cmt>כניסה לשטח</cmt>
- <desc>כניסה לשטח</desc>
- </rtept>
- <rtept lat="31.136830461" lon="35.365376817">
- <ele>0.000</ele>
- <name>A008</name>
- </rtept>
- <rtept lat="31.135110014" lon="35.363465678">
- <ele>0.000</ele>
- <name>A009</name>
- </rtept>
- <rtept lat="31.126141859" lon="35.373254513">
- <ele>0.000</ele>
- <name>A010</name>
- </rtept>
- <rtept lat="31.120207182" lon="35.373171096">
- <ele>0.000</ele>
- <name>A011</name>
- </rtept>
- <rtept lat="31.116197897" lon="35.369641876">
- <ele>0.000</ele>
- <name>A012</name>
- </rtept>
- <rtept lat="31.105586290" lon="35.366102295">
- <ele>0.000</ele>
- <name>A013</name>
- </rtept>
- <rtept lat="31.101037072" lon="35.361336210">
- <ele>0.000</ele>
- <name>A014</name>
- </rtept>
- <rtept lat="31.095571639" lon="35.361023710">
- <ele>0.000</ele>
- <name>A015</name>
- <cmt>צומת עם שביל ירוק</cmt>
- <desc>צומת עם שביל ירוק</desc>
- </rtept>
- <rtept lat="31.092793957" lon="35.368376974">
- <ele>0.000</ele>
- <name>A016</name>
- </rtept>
- <rtept lat="31.080005110" lon="35.367737755">
- <ele>0.000</ele>
- <name>A017</name>
- </rtept>
- <rtept lat="31.079040219" lon="35.351817976">
- <ele>0.000</ele>
- <name>A018</name>
- </rtept>
- <rtept lat="31.083843816" lon="35.355272899">
- <ele>0.000</ele>
- <name>A019</name>
- <cmt>מערה</cmt>
- <desc>מערה</desc>
- </rtept>
- </rte>
-</gpx>
+++ /dev/null
-#
-# Alan Map500 tracklogs< test
-#
-rm -f ${TMPDIR}/alantrl*
-gpsbabel -i alantrl -f ${REFERENCE}/alantrl.trl -o alantrl -F ${TMPDIR}/alantrl-new.trl
-gpsbabel -i alantrl -f ${TMPDIR}/alantrl-new.trl -o gpx -F ${TMPDIR}/alantrl-new.gpx
-compare ${REFERENCE}/alantrl.gpx ${TMPDIR}/alantrl-new.gpx
-
+++ /dev/null
-#
-# Alan MAp500 waypoint & route test
-#
-rm -f ${TMPDIR}/alanwpr*
-gpsbabel -i alanwpr -f ${REFERENCE}/alanwpr.wpr -o alanwpr -F ${TMPDIR}/alanwpr-new.wpr
-gpsbabel -i alanwpr -f ${TMPDIR}/alanwpr-new.wpr -o gpx -F ${TMPDIR}/alanwpr-new.gpx
-compare ${REFERENCE}/alanwpr.gpx ${TMPDIR}/alanwpr-new.gpx
-
+++ /dev/null
-
-#
-# DeLorme .an1 tests
-#
-rm -f ${TMPDIR}/an1.out
-gpsbabel -i an1 -f ${REFERENCE}/foo.an1 -o csv -F ${TMPDIR}/an1.out
-compare ${REFERENCE}/an1-in.ref ${TMPDIR}/an1.out
-
-rm -f ${TMPDIR}/an1.out
-gpsbabel -i an1 -f ${REFERENCE}/foo.an1 -o an1 -F ${TMPDIR}/an1.out
-bincompare ${TMPDIR}/an1.out ${REFERENCE}/an1-an1.ref
-
-rm -f ${TMPDIR}/an1.out
-gpsbabel -i xmap -f ${REFERENCE}/xmap -o an1 -F ${TMPDIR}/an1.out
-bincompare ${TMPDIR}/an1.out ${REFERENCE}/an1-out.ref
-
-#rm -f ${TMPDIR}/an1.out
-#gpsbabel -i gpx -f ${REFERENCE}/an1-in.gpx -o an1 -F ${TMPDIR}/an1.out
-#bincompare ${TMPDIR}/an1.out ${REFERENCE}/an1-line-out.ref
-
+++ /dev/null
-#
-# Naivguide
-#
-gpsbabel -i naviguide -f ${REFERENCE}/route/naviguide-route.twl -o gpx -F ${TMPDIR}/naviguide.gpx
-compare ${REFERENCE}/route/naviguide.gpx ${TMPDIR}/naviguide.gpx
-# Make sure ICS negative eastings and northings work.
-gpsbabel -i gpx -f ${REFERENCE}/ics.gpx -o naviguide -F ${TMPDIR}/ics.gpx.naviguide
-gpsbabel -i naviguide -f ${TMPDIR}/ics.gpx.naviguide -o gpx -F ${TMPDIR}/ics.gpx.naviguide.gpx
-compare ${REFERENCE}/ics.gpx.naviguide.gpx ${TMPDIR}/ics.gpx.naviguide.gpx
+++ /dev/null
-#
-# NetStumbler Summary File (read-only)
-#
-rm -f ${TMPDIR}/netstumbler.gpx
-gpsbabel -i netstumbler -f ${REFERENCE}/netstumbler.txt -o gpx -F ${TMPDIR}/netstumbler.gpx
-compare ${TMPDIR}/netstumbler.gpx ${REFERENCE}/netstumbler.gpx
-
extern ff_vecs_t gpl_vecs;
extern ff_vecs_t text_vecs;
extern ff_vecs_t html_vecs;
-extern ff_vecs_t netstumbler_vecs;
extern ff_vecs_t igc_vecs;
extern ff_vecs_t brauniger_iq_vecs;
extern ff_vecs_t mtk_vecs;
extern ff_vecs_t vcf_vecs;
extern ff_vecs_t google_dir_vecs;
extern ff_vecs_t maggeo_vecs;
-extern ff_vecs_t an1_vecs;
extern ff_vecs_t tomtom_vecs;
extern ff_vecs_t tef_xml_vecs;
extern ff_vecs_t vitosmt_vecs;
extern ff_vecs_t gtc_vecs;
extern ff_vecs_t dmtlog_vecs;
extern ff_vecs_t raymarine_vecs;
-extern ff_vecs_t alanwpr_vecs;
-extern ff_vecs_t alantrl_vecs;
extern ff_vecs_t vitovtt_vecs;
extern ff_vecs_t ggv_log_vecs;
#if CSVFMTS_ENABLED
extern ff_vecs_t pocketfms_fp_vecs;
extern ff_vecs_t pocketfms_wp_vecs;
extern ff_vecs_t v900_vecs;
-extern ff_vecs_t ng_vecs;
extern ff_vecs_t enigma_vecs;
extern ff_vecs_t skytraq_vecs;
extern ff_vecs_t teletype_vecs;
LegacyFormat gpl_fmt {gpl_vecs};
LegacyFormat text_fmt {text_vecs};
LegacyFormat html_fmt {html_vecs};
- LegacyFormat netstumbler_fmt {netstumbler_vecs};
LegacyFormat igc_fmt {igc_vecs};
LegacyFormat brauniger_iq_fmt {brauniger_iq_vecs};
LegacyFormat mtk_fmt {mtk_vecs};
LegacyFormat vcf_fmt {vcf_vecs};
LegacyFormat google_dir_fmt {google_dir_vecs};
LegacyFormat maggeo_fmt {maggeo_vecs};
- LegacyFormat an1_fmt {an1_vecs};
LegacyFormat tomtom_fmt {tomtom_vecs};
LegacyFormat tef_xml_fmt {tef_xml_vecs};
LegacyFormat vitosmt_fmt {vitosmt_vecs};
LegacyFormat gtc_fmt {gtc_vecs};
LegacyFormat dmtlog_fmt {dmtlog_vecs};
LegacyFormat raymarine_fmt {raymarine_vecs};
- LegacyFormat alanwpr_fmt {alanwpr_vecs};
- LegacyFormat alantrl_fmt {alantrl_vecs};
LegacyFormat vitovtt_fmt {vitovtt_vecs};
LegacyFormat ggv_log_fmt {ggv_log_vecs};
#if CSVFMTS_ENABLED
LegacyFormat pocketfms_fp_fmt {pocketfms_fp_vecs};
LegacyFormat pocketfms_wp_fmt {pocketfms_wp_vecs};
LegacyFormat v900_fmt {v900_vecs};
- LegacyFormat ng_fmt {ng_vecs};
LegacyFormat enigma_fmt {enigma_vecs};
LegacyFormat skytraq_fmt {skytraq_vecs};
LegacyFormat teletype_fmt {teletype_vecs};
"html",
nullptr,
},
- {
- &netstumbler_fmt,
- "netstumbler",
- "NetStumbler Summary File (text)",
- nullptr,
- nullptr,
- },
{
&igc_fmt,
"igc",
"gs",
nullptr,
},
- {
- &an1_fmt,
- "an1",
- "DeLorme .an1 (drawing) file",
- "an1",
- nullptr,
- },
{
&tomtom_fmt,
"tomtom",
"rwf",
nullptr,
},
- {
- &alanwpr_fmt,
- "alanwpr",
- "Alan Map500 waypoints and routes (.wpr)",
- "wpr",
- nullptr,
- },
- {
- &alantrl_fmt,
- "alantrl",
- "Alan Map500 tracklogs (.trl)",
- "trl",
- nullptr,
- },
{
&vitovtt_fmt,
"vitovtt",
nullptr,
nullptr,
},
- {
- &ng_fmt,
- "naviguide",
- "Naviguide binary route file (.twl)",
- "twl",
- nullptr,
- },
{
&enigma_fmt,
"enigma",
+++ /dev/null
-<para>
-GPSBabel supports .wpr and .trl files for Alan Map500 devices running operating
-system versions 2.xx.
-</para>
-
-<para>
-.trl contain files tracklogs. If you use a CF-Card based
-operating system, tracklog files must have a <filename>.TRL</filename> extension when
-copied to the CF-Card. The default filename is <filename>TEMP_TRK.TRL</filename>.
-Only one <filename>.TRL</filename> file may be present.
-</para>
-
-<para>
-Alan's operating system 3.0 for Map500 is not supported yet.
-At the time of this writing, OS3 is still beta.
-Documentation on the new dataformats is sparse.
-</para>
-
-<para>
-The Alan Map500 handheld GPSr is identical to the Holux GM101.
-This GPSBabel module has only been tested against the Alan Map500.
-Still, if you use a GM101, GPSBabel will probably be able to convert
-your waypoints, routes and tracklogs.
-</para>
-
-<para>
-For more information on the Alan Map500 visit
-<ulink url="http://www.alan-electronics.de/gps/gpsuebersicht.php3">Alan Germany</ulink>. There is very informative <ulink url="http://www.alan-germany.de/forum/index.php">forum</ulink>, too. The forum language is German but posts in English will be answered, too.
-</para>
+++ /dev/null
-<para>
-GPSBabel supports .wpr and .trl files for Alan Map500 devices running operating
-system versions 2.xx.
-</para>
-
-<para>
-.wpr files contain waypoints and routes. If you use a CF-Card based
-operating system, waypoint files must have a <filename>.WPR</filename> extension when
-copied to the CF-Card. The default filename is <filename>TEMPWPRT.WPR</filename>.
-Only one <filename>.WPR</filename> file may be present.
-</para>
-
-<para>
-Alan's operating system 3.0 for Map500 is not supported yet.
-At the time of this writing, OS3 is still beta.
-Documentation on the new dataformats is sparse.
-</para>
-
-<para>
-The Alan Map500 handheld GPSr is identical to the Holux GM101.
-This GPSBabel module has only been tested against the Alan Map500.
-Still, if you use a GM101, GPSBabel will probably be able to convert
-your waypoints, routes and tracklogs.
-</para>
-
-<para>
-For more information on the Alan Map500 visit
-<ulink url="http://www.alan-electronics.de/gps/gpsuebersicht.php3">Alan Germany</ulink>. There is very informative <ulink url="http://www.alan-germany.de/forum/index.php">forum</ulink>, too. Forum language is German but posts in English will be answered,
-too.
-</para>
+++ /dev/null
-<para>
-This format supports the <ulink url="http://www.delorme.com">DeLorme</ulink> ".an1" drawing file format used by their desktop software like Topo USA. It can
-currently be used to either read or write drawing files. If you use
-this format to create drawing files with routes or waypoints from another
-source, by default it will create "Red Flag" symbols for waypoints, and
-thick red lines for routes or tracks. It is possible to merge two drawing
-layers by doing something like this:
-</para>
-
-<para><userinput>gpsbabel -i an1 -f one.an1 -f two.an1 -o an1 -F merged.an1</userinput></para>
-
-<para>
-In this case, the merged data will contain all of the
-properties of the original data.
-</para>
-
-<para>
-GPSBabel has a page describing <ulink url="/formats/delorme-new-interstate/">creating routable onramps in Street Atlas with GPSBabel</ulink>.
-</para>
+++ /dev/null
-<para>Naviguide 3.02 is off-road navigation software. Naviguide covers the area of Israel and uses the Israeli old grid as a reference; Naviguide uses Hebrew as its default language.</para>
-
-<para>Naviguide uses unique map file format and binary file format (.twl) as route file.
-The *.twl file contains a route that is comprised of a list of waypoints. Naviguide does not support a file that contains only waypoints.</para>
-
-<para>GPSBabel supports reading and creating Naviguide route files. Plot files are not supported.</para>
-
+++ /dev/null
- <para>This option allows you to specify the color for
-line or mapnote data. It accepts color names of the form "#FF0000" (red) or any
-of the color names from the Cascading Style Sheets (CSS)
-specification.</para>
+++ /dev/null
-<para>
-This option allows you to specify which symbol to use for points that
-don't have a symbol already. It defaults to "Red Flag" but it accepts
-any symbol name you can put in a DeLorme export file. To find the name
-of a specific symbol in Street Atlas, let the mouse pointer hover over
-it for a few seconds and the name will be displayed.
-</para>
+++ /dev/null
-<para>
-If your original data contains geocaching-specific information such as
-difficulty and terrain, GPSBabel will automatically include that information
-in the waypoint descriptions in the generated drawing file. If you do not
-want that, specify the "nogc" option on the command line:
-</para>
-<para><userinput>gpsbabel -i gpx -f 12345.gpx -o an1,nogc -F 12345.an1</userinput></para>
-
+++ /dev/null
-<para>
-If your original waypoint data contains URLs, GPSBabel will include them as
-links in the generated drawing file. This causes the waypoint symbol to have
-a blue border, and it causes the waypoint text to be drawn in blue with an
-underline.
-</para>
-<para>
-If you do not want this behavior, specify the "nourl" option on the command
-line:
-</para>
-<para><userinput>gpsbabel -i gpx -f 12345.gpx -o an1,nourl -F 12345.an1</userinput></para>
-
+++ /dev/null
-<para>
-If the waypoint type is "circle", the "radius" option specifies
-the radius of the circles. By default, this is in miles, but it may be
-specified in kilometers by adding a 'k'. The default radius is 1/10 mile.
-</para>
+++ /dev/null
-<para>
-If you are creating a road layer, you may use the "road" option, which
-allows you to change the types of roads based on their names. You can
-change multiple roads at the same time. Currently supported types are
-</para>
-<para>
-<segmentedlist>
-<?dbhtml list-presentation="table"?>
-<segtitle>Type</segtitle>
-<segtitle>Meaning</segtitle>
-<seglistitem>
- <seg>limited</seg>
- <seg>Limited-access freeways</seg>
- </seglistitem>
- <seglistitem>
- <seg>toll</seg>
- <seg>Limited-access toll highways</seg>
- </seglistitem>
- <seglistitem>
- <seg>ramp</seg>
- <seg>Access ramps for limited-access highways</seg>
- </seglistitem>
- <seglistitem>
- <seg>us</seg>
- <seg>National highways (e.g. US routes)</seg>
- </seglistitem>
- <seglistitem>
- <seg>primary</seg>
- <seg>Primary State/Provincial routes</seg>
- </seglistitem>
- <seglistitem>
- <seg>state</seg>
- <seg>State/Provincial routes</seg>
- </seglistitem>
- <seglistitem>
- <seg>major</seg>
- <seg>Major Connectors</seg>
- </seglistitem>
- <seglistitem>
- <seg>ferry</seg>
- <seg>Ferry Routes</seg>
- </seglistitem>
- <seglistitem>
- <seg>local</seg>
- <seg>Local Roads</seg>
- </seglistitem>
- <seglistitem>
- <seg>editable</seg>
- <seg>User-drawn Roads</seg>
- </seglistitem>
- </segmentedlist>
-</para>
-<para>
-GPSBabel defaults to creating editable roads. These are routed just like
-local roads, but may be edited with the drawing tools in Street Atlas.
-</para>
-
-<para>
-This option has a special format that is best demonstrated by example:
-</para>
-
-<screen format="linespecific"> "road=I-599!limited!Beecher St.!major" </screen>
-
-<para>
-This option will cause any road named "I-599" to become a limited-access
-highway and any road named "Beecher St." to become a major connector. Note
-that roads that have had their types changed in this way are not editable
-in Street Atlas, so make sure they are where you want them before you
-change them, and make sure to keep a backup of your original road layer.
-Note that the ! is a shell metacharacter in bash and possibly other shells,
-so you may have to use single quotes or some other escape mechanism.
-</para>
-
-<para>
-There is a tutorial on
-<ulink url="https://www.gpsbabel.org/formats/delorme-new-interstate/">how
-to create an onramp for a limited access highway in Street Atlas USA
-using GPSBabel.</ulink>
-</para>
+++ /dev/null
-<para> This option specifies the type of the drawing layer
-to be created. The supported values are "drawing", "road", "trail",
-"waypoint", or "track". If you do not specify a type, the default
-will be either the type of the previous an1 file or "drawing" if there
-is no previous file. This lets you merge, for example, two road layers
-without having to specify "type=road" for the output. </para>
-
+++ /dev/null
-<para>
-This option specifies how to represent point data in the draw file.
-Valid waypoint types are "symbol", "text", "mapnote", "circle", and "image".
-The default is "symbol".
-</para>
-<para>
-If you specify a waypoint type of "image", you should make sure that the
-icon descriptions of your waypoints are the full names, including drive letters
-and full path, of image files in a format that works with your DeLorme
-product. Note that this means that the .an1 file you generate will not work
-on any computer that does not have those images in the same place; this is
-part of the design of the an1 format and cannot be avoided.
-</para>
+++ /dev/null
-<para>
-This option specifies at what zoom level Street Atlas will begin showing
-reduced versions of your symbols. The default is 10. Setting zoom to 0 will
-disable this feature. Setting it to anything but the default will override
-the zoom level specified on any waypoints that were read from an existing
-an1 file; this is by design.
-</para>